2017-08-11 88 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

相关问题