单个Spark语句中嵌套结构上的多个聚合

时间:2016-11-28 10:56:48

标签: apache-spark aggregation

我有一个像这样的json结构:

{
   "a":5,
   "b":10,
   "c":{
      "c1": 3,
      "c4": 5
   }     
}

我有一个从这个结构创建的数据框,有几百万行。我需要的是聚合在几个键中:

df.agg(count($"b") as "cntB", sum($"c.c4") as "sumC")

我是否只是错过了语法?或者有不同的方法吗?最重要的Spark应该只对所有聚合扫描一次数据。

1 个答案:

答案 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)