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
我不想使用na.fill,因为它将null放在双引号内。这与将值设置为null不同。 – Rahul
@Rahul你可以使用'df.na.fill(null.asInstanceOf [String])',你将得到''pets':'“' – philantrovert
@himanshuIIITian,你的方法也不适用于字符串以外的数据类型。我已经提出了你的答案,但这不是我正在寻找的。 – Rahul