1

Ich versuche verschiedene Möglichkeiten, einen Datensatz in einem Array von Datensätzen abzufragen und vollständige Zeile als Ausgabe anzuzeigen.Abfrage eines verschachtelten Array in Parquet Records

Ich weiß nicht, welches geschachtelte Objekt String "pg" hat. Aber ich möchte nach einem bestimmten Objekt fragen. Ob das Objekt "pg" hat oder nicht. Wenn "pg" existiert, möchte ich diese komplette Zeile anzeigen. Wie ohne specfying das Objekt "spark SQL-Abfrage" auf verschachtelte Objekte schreiben index.So ich möchte nicht den Index children.name verwenden

Mein Avro Record:

{ 
"name": "Parent", 
"type":"record", 
"fields":[ 
    {"name": "firstname", "type": "string"}, 

    { 
     "name":"children", 
     "type":{ 
      "type": "array", 
      "items":{ 
         "name":"child", 
         "type":"record", 
         "fields":[ 
          {"name":"name", "type":"string"} 
         ] 
        } 
      } 
    } 
] 
} 

Ich bin mit Spark-SQL Kontext zum Abfragen des gelesenen Datenrahmens. Also, wenn Eingang

Row no Firstname Children.name 
    1 John  Max 
        Pg 
    2 Bru  huna 
        aman 

Output poq zurückkehren sollte 1, da es Zeile hat, wo ein Objekt von children.name pg ist.

val results = sqlc.sql("SELECT firstname, children.name FROM nestedread where children.name = 'pg'") 
results.foreach(x=> println(x(0), x(1).toString)) 

Die obige Abfrage funktioniert nicht. aber es funktioniert, wenn ich Kinder [1] .name abfrage.

Ich möchte auch wissen, dass, wenn ich eine Reihe von Datensätzen filtern und dann explodieren kann. Anstatt zuerst zu explodieren und eine große Anzahl von Zeilen zu erstellen und dann zu filtern.

+0

Kinder ist ein Array, children.name bedeutet nichts. children [1] .name bedeutet, dass Sie auf das erste Objekt in diesem Array zugreifen und das name-Attribut lesen. – RoyaumeIX

+0

Ja. Aber ich möchte nach einem bestimmten Objekt fragen. Ob das Objekt pg hat oder nicht. Wenn pg existiert, möchte ich diese komplette Zeile anzeigen. Wie schreibt man "sql query" auf geschachtelte Objekte, ohne den Objektindex zu spezifizieren. – pg20

+0

Haben Sie dies überprüft: http://bender.io/2013/09/22/returning-hierarchical-data-in-a-single-sql-query/? – RoyaumeIX

Antwort

4

Es scheint, dass Sie

org.apache.spark.sql.functions.explode(e: Column): Column 

zum Beispiel in meinem Projekt (in Java) verwenden können, i json wie folgt verschachtelt:

{ 
    "error": [], 
    "trajet": [ 
     { 
      "something": "value" 
     } 
    ], 
    "infos": [ 
     { 
      "something": "value" 
     } 
    ], 
    "timeseries": [ 
     { 
      "something_0": "value_0", 
      "something_1": "value_1", 
      ... 
      "something_n": "value_n" 
     } 
    ] 
} 

und ich wollte in Daten analysieren " Zeitreihen ", also tat ich:

DataFrame ts = jsonDF.select(org.apache.spark.sql.functions.explode(jsonDF.col("timeseries")).as("t")) 
        .select("t.something_0", 
          "t.something_1", 
          ... 
          "t.something_n"); 

Ich bin neu zu funken auch. Hoffe, das könnte dir einen Hinweis geben.

+0

Hallo, danke. Ich habe einen Weg durch Explode gefunden. val results = sqlc.sql ("SELECT Vorname, Kind.name, FROM Eltern LATERAL VIEW explode (Kinder) ChildTable AS Kind") – pg20

+0

Ich möchte auch wissen, dass, wenn ich eine Reihe von Datensätzen filtern und dann explodieren kann. Anstatt zuerst zu explodieren und eine große Anzahl von Zeilen zu erstellen und dann zu filtern. – pg20

0

Das Problem wurde gelöst durch

Ich fand einen Weg durch Explode.

val results = sqlc.sql("SELECT firstname, child.name, FROM parent LATERAL VIEW explode(children) childTable AS child