2017-08-11 84 views
2

我有從csv中讀取的數據幀。如何在Spark中將數據幀轉換爲json時打印空值

CSV: 
name,age,pets 
Alice,23,dog 
Bob,30,dog 
Charlie,35, 

Reading this into a DataFrame called myData: 
+-------+---+----+ 
| name|age|pets| 
+-------+---+----+ 
| Alice| 23| dog| 
| Bob| 30| dog| 
|Charlie| 35|null| 
+-------+---+----+ 

現在,我想這個數據幀中的每一行轉換爲使用myData.toJSON一個JSON。我得到的是以下jsons。

{"name":"Alice","age":"23","pets":"dog"} 
{"name":"Bob","age":"30","pets":"dog"} 
{"name":"Charlie","age":"35"} 

我想第三行的json包含空值。防爆。

{"name":"Charlie","age":"35", "pets":null} 

但是,這似乎不可能。我通過代碼調試,看到火花的org.apache.spark.sql.catalyst.json.JacksonGenerator類具有以下實施

private def writeFields(
    row: InternalRow, schema: StructType, fieldWriters: 
    Seq[ValueWriter]): Unit = { 
    var i = 0 
    while (i < row.numFields) { 
     val field = schema(i) 
     if (!row.isNullAt(i)) { 
     gen.writeFieldName(field.name) 
     fieldWriters(i).apply(row, i) 
     } 
     i += 1 
    } 
    } 

這似乎是跳過一列,如果它是空的。我不太清楚爲什麼這是默認行爲,但有沒有辦法在Spark中使用toJSON打印json中的空值?

我使用星火2.1.0

回答

5

要使用斯巴克的toJSON方法打印JSON的空值,可以使用下面的代碼:

myData.na.fill("null").toJSON 

它會給你預期的結果:

+-------------------------------------------+ 
|value          | 
+-------------------------------------------+ 
|{"name":"Alice","age":"23","pets":"dog"} | 
|{"name":"Bob","age":"30","pets":"dog"}  | 
|{"name":"Charlie","age":"35","pets":"null"}| 
+-------------------------------------------+ 

我希望它有幫助!

+0

我不想使用na.fill,因爲它將null放在雙引號內。這與將值設置爲null不同。 – Rahul

+2

@Rahul你可以使用'df.na.fill(null.asInstanceOf [String])',你將得到''pets':'「' – philantrovert

+1

@himanshuIIITian,你的方法也不適用於字符串以外的數據類型。我已經提出了你的答案,但這不是我正在尋找的。 – Rahul

相關問題