2017-06-30 7 views
1

Ich habe folgendes Schema -Wie gruppiert man nach einem Feld innerhalb eines Arrays eines Arrays von Datensätzen?

[Name: String, Qualitäten: arraytype ( StructType ( StructField (subject_grades, arraytype (StructType (StructField (Subjekt, String, false), StructField (Grad, LongType false)]

I zu groupby auf dem Fachgebiet innerhalb des subject_grades Array wollen, die innerhalb der Qualitäten Array ist.

ich versuchte

sql.sql("select ... from grades_table group by grades.subject_grades.subject") 

aber ich bekomme

org.apache.spark.sql.AnalysisException: cannot resolve 'grades.subject_grades[subject]' due to data type mismatch: argument 2 requires integral type, however, 'subject' is of string type.; 

Ich verstehe, warum ich diesen Fehler, aber ich hatte gehofft, dass ich zu vermeiden, könnte die ganze Sache, um Gruppe explodiert, indem Sie auf dem inneren Bereich.

Antwort

1

Arrays sind (relativ) schwer zu bearbeiten und um explode (oder flatMap) zu bitten, mit ihnen zu arbeiten, wenn die Hauptabfrage die Elemente innerhalb benötigt, z.B. zum Gruppieren.

Etwas, das ich von der Frage gelernt habe, ist, dass die folgende Klausel mit subject_grades Wesen vom Typ ArrayType auf eine Klausel übersetzt mit subject der Index und damit die Anforderung der integralen Typ zu sein.

group by grades.subject_grades.subject 

würde ich keinen anderen Weg sehen, aber mit explode (oder flatMap) auf „destrukturiert“ die subject_grades Array und die Gruppierung tun.

+1

Ich lese dein Buch, wie kann ich es nicht als Antwort nehmen :) – Raytracer

Verwandte Themen