2016-08-02 147 views
0

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

回答

0

爲什麼爆炸和組而不是選擇?

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

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