我有一些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数组中。对此的任何帮助都会很棒。
答案 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")