Spark:如何在json

时间:2017-03-31 08:06:47

标签: json apache-spark

我的数据如下:

{"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?

2 个答案:

答案 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|
+-------------+----+