2016-06-14 130 views
1

我的要求是將數據幀作爲輸入參數傳遞給scala類,該類將json格式的數據保存爲hdfs。sparksql將數據幀轉換爲json

輸入參數如下:

case class ReportA(
        parm1: String, 
        parm2: String, 
        parm3: Double, 
        parm4: Double, 
        parm5: DataFrame 
       ) 

我創建了一個JSON對象爲這個參數,如:

def write(xx: ReportA) = JsObject(
     "field1" -> JsString(xx.parm1), 
     "field2" -> JsString(xx.parm2), 
     "field3" -> JsNumber(xx.parm3), 
     "field4" -> JsNumber(xx.parm4), 
     "field5" -> JsArray(xx.parm5) 
    ) 

parm5是一個數據框,想爲JSON數組轉換。

如何將數據框轉換爲Json數組?

謝謝你的幫助!

+0

你有沒有看到toJson方法從下面的https://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/sql/DataFrame.html? –

回答

2

DataFrame可以看作是數據庫中普通舊錶的等同物,具有行和列。你不能只是從它那裏得到一個簡單的數組,你woud走到陣列最接近的是結構如下:

[ 
    "col1": [val1, val2, ..], 
    "col2": [val3, val4, ..], 
    "col3": [val5, val6, ..] 
] 

要達到類似的結構,你可以使用數據框API的toJSON方法得到一個RDD<String>,然後再做collect(注意任何OutOfMemory例外)。

您現在有一個Array[String],根據您使用的JSON庫,您可以簡單地在JsonArray中轉換。

雖然這似乎是一個非常奇怪的使用Spark的方式,但您通常不會將RDD或DataFrame直接輸出並轉換爲其中一個對象,您通常會將其泄露到存儲解決方案中。

+1

注意:我認爲這個方法被命名爲'toJSON'(所有大寫都帶有JSON)。 –

+0

@JoshRosen事實上,我已經更新了我的答案,謝謝指出! –