我的数据如下:
{"domain_userid":"a","g_id":"1"}
{"domain_userid":"b"}
{"domain_userid":"c","g_id":""}
我正在使用
将其加载到DataFrame中spark.read.schema(myschema).json("/my/json")
这会生成如下的DataFrame:
+--------------------+--------+
| domain_userid|g_id |
+--------------------+--------+
|a | 1 |
|b | null |
|c | |
我正在寻找的是
+--------------------+--------+
| domain_userid|g_id |
+--------------------+--------+
|a | 1 |
|b | null|
|c | null|
我知道我可以编写一个udf来将空字符串映射为null,但是我的数据有很多列(100+)所以这看起来可能会有性能损失,因为涉及到许多转换。 json解析器上是否有任何标志/选项只能从一开始写入null?
答案 0 :(得分:1)
事实证明,CSV阅读器有这样一个选项:
@Shared
String subjectToTest
def setupSpec() {
subjectToTest = "sTring To Test"
}
def "test using method pointers"() {
when:
def result = methodPointer()
then:
result == expectecResult
where:
expectecResult | methodPointer
'STRING TO TEST' | subjectToTest.&toUpperCase
'string to test' | subjectToTest.&toLowerCase
}
但是,json阅读器尚未实现此选项。 (https://spark.apache.org/docs/latest/api/java/org/apache/spark/sql/DataFrameReader.html#json-org.apache.spark.sql.Dataset-)
答案 1 :(得分:0)
json文件:
{"domain_userid":"","g_id":"1"}
{"domain_userid":"b"}
{"domain_userid":"c","g_id":""}
试试这个:
df = spark.read.load('file:///home/zht/PycharmProjects/test/json_file.json', format='json')
myfunc = f.UserDefinedFunction(lambda *args: map(lambda x: None if x == '' else x, args),
returnType=ArrayType(StringType()))
cols = df.columns
df = df.select(myfunc(*cols)).rdd.flatMap(lambda x: x)
df = spark.createDataFrame(df, schema=cols)
df.show()
并输出:
+-------------+----+
|domain_userid|g_id|
+-------------+----+
| null| 1|
| b|null|
| c|null|
+-------------+----+