Pyspark:读取对象之间没有分隔符的 JSON 数据文件
Pyspark: Reading JSON data file with no separator between objects
我有一个将数据放入 S3 的 kinesis firehose 传输流。但是在数据文件中 json 对象之间没有分隔符。所以它看起来像这样,
{
"key1" : "value1",
"key2" : "value2"
}{
"key1" : "value1",
"key2" : "value2"
}
在 Apache Spark 中,我这样做是为了读取数据文件,
df = spark.read.schema(schema).json(path, multiLine=True)
这只能读取文件中的第一个 json 对象,其余的将被忽略,因为没有分隔符。
我如何使用 spark 解决这个问题?
您可以使用 sparkContext
的 wholeTextFiles
api 将 json 文件 读入 Tuple2(filename, whole text)
, 将整个文本解析为 multiLine jsons, 最后使用 sqlContext
将其读取为 json 到 dataframe.
sqlContext\
.read\
.json(sc
.wholeTextFiles("path to your multiline json file")
.values()
.flatMap(lambda x: x
.replace("\n", "#!#")
.replace("{#!# ", "{")
.replace("#!#}", "}")
.replace(",#!#", ",")
.split("#!#")))\
.show()
你应该得到 dataframe
作为
+------+------+
| key1| key2|
+------+------+
|value1|value2|
|value1|value2|
+------+------+
不过您可以根据需要修改代码
我有一个将数据放入 S3 的 kinesis firehose 传输流。但是在数据文件中 json 对象之间没有分隔符。所以它看起来像这样,
{
"key1" : "value1",
"key2" : "value2"
}{
"key1" : "value1",
"key2" : "value2"
}
在 Apache Spark 中,我这样做是为了读取数据文件,
df = spark.read.schema(schema).json(path, multiLine=True)
这只能读取文件中的第一个 json 对象,其余的将被忽略,因为没有分隔符。
我如何使用 spark 解决这个问题?
您可以使用 sparkContext
的 wholeTextFiles
api 将 json 文件 读入 Tuple2(filename, whole text)
, 将整个文本解析为 multiLine jsons, 最后使用 sqlContext
将其读取为 json 到 dataframe.
sqlContext\
.read\
.json(sc
.wholeTextFiles("path to your multiline json file")
.values()
.flatMap(lambda x: x
.replace("\n", "#!#")
.replace("{#!# ", "{")
.replace("#!#}", "}")
.replace(",#!#", ",")
.split("#!#")))\
.show()
你应该得到 dataframe
作为
+------+------+
| key1| key2|
+------+------+
|value1|value2|
|value1|value2|
+------+------+
不过您可以根据需要修改代码