2015-10-02 19 views
16

Robię kilka testów na iskrę za pomocą scala. Zwykle odczytać pliki json, który musi być manipulowany jak w poniższym przykładzie:Spłaszczanie wierszy w Spark

test.json:

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

Jak mogę przekonwertować go na następującym formacie:

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

Odpowiedz

32

Można użyć funkcji 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

dzięki, że działa świetnie w powłoce. jednak, gdy próbuję tego w Intellij pojawia się błąd podczas próby odniesienia do kolumny b z $ "b". czy wiesz, jak można to rozwiązać? –

+3

Spróbuj ['import sqlContext.implicits._'] (https://github.com/apache/spark/blob/8ecba3e86e53834413da8b4299f5791545cae12e/sql/core/src/main/scala/org/apache/spark/sql/SQLContext.scala # L349). Możesz także użyć 'org.apache.spark.sql.functions.col' i zastosować 'DataFrame (df (" b "))'. – zero323

Powiązane problemy