2016-08-02 6 views
0

Ich habe einige JSON-Daten, bei denen eines der Elemente ein Array ist. Hier ist ein Beispieldatensatz:Sparksql: Json-Array, das die Reihenfolge der Elemente verwaltet

{ "name": "Michael", "Schulen": [{ "sname": "Stanford", "Jahr": 2010} { "sname": "berkeley", "Jahr": 2012}, {"sname": "mit", "Jahr": 2016}]}

{"name": "Andy", "Schulen": [{"sname": "ucsb" "Jahr": 2011}, { "sname": "UCSD", "Jahr": 2015}]]}

I Namen als Schlüssel und für einen bestimmten Namen verwenden will, ich will alle kombinieren die Schulnamen in der Reihenfolge, in der sie im Array vorhanden sind.

ist die gewünschte o/p:

michael, "Stanford berkeley mit"

Andy "UCSB UCSD"

Hier ist mein Code:

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> schulen.show()

+ ------- + -------- +

| Name | schieße |

+ ------- + -------- +

| Michael | Stanford |

| Michael | berkeley |

| Michael | mit |

+ ------- + -------- +

Leider, wenn ich Gruppe dies durch Schlüssel, ich bin nicht sicher, ob Ordnung (wahrscheinlich nicht) beibehalten wird. Ich möchte nicht, dass die Schulnamen für Michael neu geordnet werden, sie sollten so aussehen, wie sie im ursprünglichen json-Array vorhanden waren. Jede Hilfe mit diesem wird groß sein.

Antwort

0

Warum explodieren und gruppieren statt wählen?

people.select("name", "schools.sname") 

Es wird die Reihenfolge beibehalten, wie Sie möchten.

+0

Das gibt mir wie Sname sname: Array : [Stanford, berkeley, mit]. Wie bekomme ich String "Stanford, Berkeley, mit". Ich habe versucht, udf, aber das scheitert. val test = people.select ("name", "schulen.sname") val getConcatenated = udf ((snames: Array [Zeichenfolge]) => {snames.mkString ("")}) val test_cat = test .withColumn (col ("name"), getConcatenated (col ("sname")) – user3803714

+0

Das funktioniert einwandfrei val people = sqlContext.read.json ("test.json") val test = people.select ("name "," schools.sname ") val getConcatenated = udf ((erstes: Seq [String]) => {first.mkString (" ")}) val test_cat = newtest.withColumn ("sname_concat", getConcatenated (col ("sname"))) auswählen ("name", "sname_concat") – user3803714

0

Der folgende Code funktioniert, was in der Frage gestellt wurde.

Verwandte Themen