16

Sto facendo qualche test per la scintilla usando scala. Noi di solito leggere i file JSON che deve essere manipolato come il seguente esempio:Flattening Rows in Spark

test.json:

{"a":1,"b":[2,3]} 
val test = sqlContext.read.json("test.json") 

Come posso convertirlo nel seguente formato:

{"a":1,"b":2} 
{"a":1,"b":3} 

risposta

32

È possibile utilizzare la funzione explode:

scala> import org.apache.spark.sql.functions.explode 
import org.apache.spark.sql.functions.explode 


scala> val test = sqlContext.read.json(sc.parallelize(Seq("""{"a":1,"b":[2,3]}"""))) 
test: org.apache.spark.sql.DataFrame = [a: bigint, b: array<bigint>] 

scala> test.printSchema 
root 
|-- a: long (nullable = true) 
|-- b: array (nullable = true) 
| |-- element: long (containsNull = true) 

scala> val flattened = test.withColumn("b", explode($"b")) 
flattened: org.apache.spark.sql.DataFrame = [a: bigint, b: bigint] 

scala> flattened.printSchema 
root 
|-- a: long (nullable = true) 
|-- b: long (nullable = true) 

scala> flattened.show 
+---+---+ 
| a| b| 
+---+---+ 
| 1| 2| 
| 1| 3| 
+---+---+ 
+0

grazie, che funziona benissimo nella shell. tuttavia, quando provo questo in Intellij ricevo un errore quando provo a fare riferimento alla colonna b con $ "b". sai come questo può essere risolto? –

+3

Prova ['import sqlContext.implicits._'] (https://github.com/apache/spark/blob/8ecba3e86e53834413da8b4299f5791545cae12e/sql/core/src/main/scala/org/apache/spark/sql/SQLContext.scala # L349). Puoi anche usare 'org.apache.spark.sql.functions.col' e applicare su 'DataFrame (df (" b "))'. – zero323