Sparksql:Json数组维护元素顺序
问题描述:
我有一些json数据,其中一个元素是数组。下面是一个简单的数据集:Sparksql:Json数组维护元素顺序
{ “名”: “迈克尔”, “学校”:[{ “SNAME”: “斯坦福大学”, “年”:2010} { “SNAME”: “伯克利” “year”:2012},{“sname”:“mit”,“year”:2016}]}
{“name”:“Andy”,“schools”:[{“sname”:“ucsb” ,“年”:2011},{“sname”:“ucsd”,“year”:2015}]]}
我想使用名称作为键和给定名称,我想将所有学校名称按照它们出现在数组中的顺序排列。
这里是所希望的O/P:
迈克尔, “斯坦福大学伯克利分校MIT”
安迪 “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")
scala> schools.show()
+ ------- + -------- +
|名称| SNAME |
+ ------- + -------- +
|迈克尔|斯坦福|
| Michael | berkeley |
| Michael |麻省理工学院|
+ ------- + -------- +
不幸的是,当我这个组由关键,我不知道,如果订单将被保留(很可能不是)。我不想让迈克尔的学校名称重新排序,它们应该以他们出现在原始json数组中的形式出现。任何帮助,这将是伟大的。
答
为什么爆炸和组而不是选择?
people.select("name", "schools.sname")
它将保持您想要的订单。
答
以下代码在问题中提出了问题。
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")
这给了我sname作为sname:数组:[stanford,berkeley,mit]。我如何得到字符串“斯坦福,伯克利,mit”。我尝试过udf,但是失败了。 val test = people.select(“name”,“schools.sname”) val getConcatenated = udf((snames:Array [String])=> {snames.mkString(“”)}) val test_cat = test .withColumn(col(“name”),getConcatenated(col(“sname”)) –
user3803714
这可以正常工作 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”) – user3803714