获取

2017-04-09 41 views
0

我已经用以下结构存储在一个JSON格式我的数据存储在JSON星火值列表的统计特性:获取

{"generationId":1,"values":[-36.0431,-35.913,...,36.0951]} 

我想要得到的间距分布之间(不同连续数字)在文件平均值(generationIds)之间。

在我zepplein笔记本电脑上的第一行是:

import org.apache.spark.sql.SparkSession 
val warehouseLocation = "/user/hive/warehouse" 
val spark = SparkSession.builder().appName("test").config("spark.sql.warehouse.dir", warehouseLocation).enableHiveSupport().getOrCreate() 
val jsonData = spark.read.json("/user/hive/warehouse/results/*.json") 
jsonData.createOrReplaceTempView("results") 

我刚才不过意识到,这不是一个好主意。在上面的JSON数据现在看起来是这样的:

val gen_1 = spark.sql("SELECT * FROM eig where generationId = 1") 
gen_1.show() 
+------------+--------------------+ 
|generationId|    values| 
+------------+--------------------+ 
|   1|[-36.0431, -35.91...| 
+------------+--------------------+ 

所有值都在同一领域。

你有什么想法如何以不同的方式来解决这个问题?它不一定非要是Hive。任何Spark相关的解决方案都可以。

值的数量可以是〜10000,以后。我想将这个分布和一个已知的函数(模拟vs理论)一起绘制出来。

回答

1

这个递归函数,这还不是特别优雅,当然也不经过实战检验,可以计算出的差异(假设偶数大小集合):

def differences(l: Seq[Double]): Seq[Double] = { 
    if (l.size < 2) { 
     Seq.empty[Double] 
    } else { 
     val values = l.take(2) 
     Seq(Math.abs(values.head - values(1))) ++ differences(l.tail) 
    } 
} 

鉴于这样的功能,你可以将其应用于像这样的火花:

jsonData.map(r => (r.getLong(0), differences(r.getSeq[Double](1)))) 
+0

这很酷,感谢这篇技巧,我已经学到了一些东西。尽管我没有看到,我怎么能走得更远,并得到我想要的分布,因为现在间距可以通过采取行[2] - 行[1],行[3] - 行[2]等来提取...,这在SQL中并不方便。 – bayerb

+0

我不是SQL专家,所以我会使用Scala REPL来创建一个函数,该函数需要一个值的集合并返回一个具有相邻值之间差异的新集合。然后,我会看到如何将该逻辑合并到我在Spark中的DataFrame转换中。基于我自己的经验,基本上是一种纯粹的程序化方法。 – Vidya

+0

忘记'explode'。虽然在大多数情况下都很有帮助,但我提供了一个更简单的解决方案。 – Vidya