Sparksql:Json数组维护元素的顺序

时间:2016-08-02 18:16:13

标签: apache-spark apache-spark-sql

我有一些json数据,其中一个元素是一个数组。这是一个示例数据集:

  

{"姓名":" Michael","学校":[{" sname":" stanford" ,"年":2010} {" sname":" berkeley","年":2012},{" sname&# 34;:" mit"," year":2016}]}

     

{"姓名":" Andy","学校":[{" sname":" ucsb" ,"年":2011},{" sname":" ucsd","年":2015}]]}

我想使用name作为键,对于给定的名称,我想按照它们在数组中的顺序组合所有学校名称。

这是所需的o / p:

  迈克尔," stanford berkeley mit"

     

Andy" ucsb ucsd"

这是我的代码:

val people = sqlContext.read.json("test.json")
val flattened = people.select($"name", explode($"schools").as("schools_flat"))
val schools = flattened.select("name", "schools_flat.sname")

阶> schools.show()

+ ------- + -------- +

|名称| SNAME |

+ ------- + -------- +

|迈克尔|斯坦福|

|迈克尔|伯克利|

|迈克尔| MIT |

+ ------- + -------- +

不幸的是,当我按键对此进行分组时,我不确定是否会保留订单(很可能不会)。我不想让迈克尔的学校名称被重新排序,它们应该出现在原始的json数组中。对此的任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

为什么要爆炸和分组而不是选择?

people.select("name", "schools.sname")

它会保留您想要的顺序。

答案 1 :(得分:0)

以下代码执行问题中提到的内容。

 val people = sqlContext.read.json("test.json")
 val test = people.select("name", "schools.sname") 
 val getConcatenated = udf( (first:  Seq[String]) => { first.mkString(" ") } )
 val test_cat = newtest.withColumn("sname_concat", getConcatenated(col("sname"))).select("name", "sname_concat")