2015-08-06 3 views
7

Esiste un modo semplice per utilizzare la colonna explode nella colonna dell'array su SparkSQL DataFrame? È relativamente semplice in Scala, ma questa funzione sembra non essere disponibile (come menzionato in javadoc) in Java.SparkSQL ed esplosione su DataFrame in Java

Un'opzione è utilizzare la funzione SQLContext.sql(...) e explode all'interno della query, ma sto cercando un modo migliore e soprattutto più pulito. DataFrame s vengono caricati da file parquet.

risposta

6

Sembra che sia possibile utilizzare una combinazione di org.apache.spark.sql.functions.explode(Column col) e DataFrame.withColumn(String colName, Column col) per sostituire la colonna con la versione esplosa di esso.

12

Ho risolto il problema in questo modo: diciamo che si dispone di una colonna di array contenente le descrizioni del lavoro denominate "posizioni", per ogni persona con "fullName".

Poi si arriva da schema iniziale:

root 
|-- fullName: string (nullable = true) 
|-- positions: array (nullable = true) 
    | |-- element: struct (containsNull = true) 
    | | |-- companyName: string (nullable = true) 
    | | |-- title: string (nullable = true) 
... 

allo schema:

root 
|-- personName: string (nullable = true) 
|-- companyName: string (nullable = true) 
|-- positionTitle: string (nullable = true) 

facendo:

DataFrame personPositions = persons.select(persons.col("fullName").as("personName"), 
      org.apache.spark.sql.functions.explode(persons.col("positions")).as("pos")); 

    DataFrame test = personPositions.select(personPositions.col("personName"), 
    personPositions.col("pos").getField("companyName").as("companyName"), personPositions.col("pos").getField("title").as("positionTitle"));