Wie werden Daten mit SparkR unnest?

UsingSparkR Wie können verschachtelte Arrays "aufgelöst" werden? Ich habe versucht mitexplode wie so:

 dat <- nested_spark_df %>% 
     mutate(a=explode(metadata)) %>%
     head()

Aber obwohl das oben Genannte nicht dazu führt, dass eine Ausnahme ausgelöst wird, werden die verschachtelten Felder in @ nicht heraufgestufmetadata auf die oberste Ebene. Im Wesentlichen suche ich ein Verhalten ähnlich dem von Hive'sLATERAL VIEW explode() Funktionalität ohne sich auf ein @ zu verlassHiveContext.

Bitte beachten Sie, dass ich im Code-Snippet den NSE verwende, der über @ aktiviert wurdSparkRext. Ich denke das entspricht gerade-SparkR wäre so etwas wie... %>% mutate(a=explode(nested_spark_df$metadata)) ... oder so ähnlich.

BEARBEITE

Ich habe versucht mitLATERAL VIEW explode(...) in demSparkR::sql Funktion. Es scheint großartig mit Parkett- und ORC-Daten zu funktionieren. Beim Arbeiten mit verschachtelten Avro-Daten habe ich jedoch versucht:

dat <- collect(sql(HiveContext,
                   paste0("SELECT a.id, ax.arrival_airport, x.arrival_runway ",
                          "FROM avrodb.flight a ",  
                             "LATERAL VIEW explode(a.metadata) a AS ax ",
                          "WHERE ax.arrival_airport='ATL'")))

Nur um den folgenden Fehler zu erhalten, obwohl, wenn ein Swap-outavrodb mitparquetdb enthält äquivalente Daten und macht das, was ich erwarte.

Error in invokeJava(isStatic = TRUE, className, methodName, ...) :
  org.apache.spark.SparkException: Job aborted due to stage failure: Task 4 in stage 5.0 failed 4 times, most recent failure: Lost task 4.3 in stage 5.0 (TID 1345, dev-dn04.myorg.org): org.apache.avro.AvroTypeException: Found metadata, expecting union
    at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:292)
    at org.apache.avro.io.parsing.Parser.advance(Parser.java:88)
    at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:267)
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:155)
    at org.apache.avro.generic.GenericDatumReader.readArray(GenericDatumReader.java:219)
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:155)
    at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193)
    at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183)
    at org.apache.avr
Calls: <Anonymous> ... collect -> collect -> .local -> callJStatic -> invokeJava

Dies trotz der Tatsache, dass ich das DataBricks Avro-Paket beim Starten von Spark einbezogen habe. Lesen der gleichen Daten mit dem Funken mit einemSQLContext (anstatt desHiveContext) funktioniert einwandfrei, außer dass ich nicht in der Lage war, herauszufinden, wie man das @ effektiv einsetexplode() Funktion. Ich habe auch bestätigt, dass dies kein Problem mit den Daten selbst ist, indem ich dieselben Dateien über Hive mit derselben HQL-Anweisung, die ich mit @ ausgeführt habe, erfolgreich abgefragt habSparkR::sql(HiveContext, hql)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage