我有一些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數組中的形式出現。任何幫助,這將是偉大的。
這給了我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