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