使用 Spark 获取存储在 JSON 中的值列表的统计属性
Get statistical properties of a list of values stored in JSON with Spark
我使用以下结构以 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,及以后。我想将此分布与已知函数(模拟与理论)一起绘制。
这个递归函数,虽然不是很优雅,当然也没有经过实战检验,但可以计算差异(假设集合大小为偶数):
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)
}
}
鉴于这样的功能,您可以像这样在 Spark 中应用它:
jsonData.map(r => (r.getLong(0), differences(r.getSeq[Double](1))))
我使用以下结构以 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,及以后。我想将此分布与已知函数(模拟与理论)一起绘制。
这个递归函数,虽然不是很优雅,当然也没有经过实战检验,但可以计算差异(假设集合大小为偶数):
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)
}
}
鉴于这样的功能,您可以像这样在 Spark 中应用它:
jsonData.map(r => (r.getLong(0), differences(r.getSeq[Double](1))))