16

में फ़्लैटनिंग पंक्तियां मैं स्कैला का उपयोग करके स्पार्क के लिए कुछ परीक्षण कर रहा हूं।स्पार्क

test.json:

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

मैं इसे कैसे निम्न स्वरूप को परिवर्तित कर सकते हैं:

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

उत्तर

32

हम आम तौर पर json फ़ाइलें जो निम्न उदाहरण की तरह चालाकी से किए जाने की आवश्यकता को पढ़ने के आप 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

धन्यवाद, यह खोल में बहुत अच्छा काम करता है। हालांकि, जब मैं इंटेलिज में इसे आज़माता हूं तो मुझे कॉलम बी को "बी" के साथ संदर्भित करने का प्रयास करते समय त्रुटि होती है। क्या आप जानते हैं कि इसे कैसे हल किया जा सकता है? –

+3

कोशिश करें ['sqlContext.implicits._' आयात करें] (https://github.com/apache/spark/blob/8ecba3e86e53834413da8b4299f5791545cae12e/sql/core/src/main/scala/org/apache/spark/sql/SQLContext.scala # L349)। आप 'org.apache.spark.sql.functions.col' का भी उपयोग कर सकते हैं और 'डेटाफ्रेम (डीएफ ("बी")) पर लागू होते हैं। – zero323