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") 

它将保持您想要的订单。

+0

这给了我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

+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”) – 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")