如何读取嵌套的JSON以进行聚合?

时间:2017-12-07 12:14:57

标签: java json apache-spark apache-spark-sql

我是Spark的新手。 我想做的就是读取嵌套的jsons并根据特定条件对它们进行分组。 例如:如果json包含像他的城市和邮政编码这样的人的详细信息。我想对属于同一城市和邮政编码的人进行分组。

我已经取得了进展,直到将jsons读入DataSet。 但我不知道如何将它们分组。

我的嵌套JSON格式是

{
  "entity": {
    "name": "SJ",
    "id": 31
  },
  "hierarchy": {
    "state": "TN",
    "city": "CBE"
  },
  "data": {}}

这是我编写的用于从文件中读取嵌套json的代码。

public void groupJsonString(SparkSession spark) {
    Dataset<Row> studentRecordDS = spark.read()
            .option("timestampFormat", "yyyy/MM/dd HH:mm:ss ZZ")
            .json("/home/shiney/Documents/NGA/sparkJsonFiles/*.json");
    StructType st = studentRecordDS.schema();


    List<StructType> nestedList = new ArrayList<>();
    for(StructField field : st.fields()) {
        nestedList.add((StructType)field.dataType());
    }   

}

1 个答案:

答案 0 :(得分:2)

TL; DR 使用spark.read.json(正如您所做的那样),然后使用&#34;展平&#34; select中的运算符。

(我使用Scala并将转换为Java作为您的家庭练习:))

让我们使用您的样本。

$ cat ../datasets/sample.json
{
  "entity": {
    "name": "SJ",
    "id": 31
  },
  "hierarchy": {
    "state": "TN",
    "city": "CBE"
  },
  "data": {}
}

代码可以如下(再次是它的Scala)。

val entities = spark
  .read
  .option("multiLine", true)
  .json("../datasets/sample.json")
scala> entities.printSchema
root
 |-- entity: struct (nullable = true)
 |    |-- id: long (nullable = true)
 |    |-- name: string (nullable = true)
 |-- hierarchy: struct (nullable = true)
 |    |-- city: string (nullable = true)
 |    |-- state: string (nullable = true)

让我们展开entityhierarchy个顶级列。

scala> entities.select("entity.*", "hierarchy.*").show
+---+----+----+-----+
| id|name|city|state|
+---+----+----+-----+
| 31|  SJ| CBE|   TN|
+---+----+----+-----+

现在聚合应该是明智的。