我有一个像这样的json结构:
{
"a":5,
"b":10,
"c":{
"c1": 3,
"c4": 5
}
}
我有一个从这个结构创建的数据框,有几百万行。我需要的是聚合在几个键中:
df.agg(count($"b") as "cntB", sum($"c.c4") as "sumC")
我是否只是错过了语法?或者有不同的方法吗?最重要的Spark应该只对所有聚合扫描一次数据。
答案 0 :(得分:1)
这是可能的,但您的JSON必须在一行中。
每一行=新的JSON对象。
val json = sc.parallelize(
"{\"a\":5,\"b\":10,\"c\":{\"c1\": 3,\"c4\": 5}}" :: Nil)
val jsons = sqlContext.read.json(json)
jsons.agg(count($"b") as "cntB", sum($"c.c4") as "sumC").show
正常工作 - 请注意json格式化为一行。
jsons.printSchema()
正在打印:
root
|-- a: long (nullable = true)
|-- b: long (nullable = true)
|-- c: struct (nullable = true)
| |-- c1: long (nullable = true)
| |-- c4: long (nullable = true)