JSON Pyspark 中的文件解析
JSON file parsing in Pyspark
我是 Pyspark 的新手。我尝试使用以下代码
解析 JSON 文件
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.read.json("file:///home/malwarehunter/Downloads/122116-path.json")
df.printSchema()
输出结果如下
root
|-- _corrupt_record: string (nullable = true)
df.show()
输出看起来像这样
+--------------------+
| _corrupt_record|
+--------------------+
| {|
| "time1":"2...|
| "time2":"201...|
| "step":0.5,|
| "xyz":[|
| {|
| "student":"00010...|
| "attr...|
| [ -2.52, ...|
| [ -2.3, -...|
| [ -1.97, ...|
| [ -1.27, ...|
| [ -1.03, ...|
| [ -0.8, -...|
| [ -0.13, ...|
| [ 0.09, -...|
| [ 0.54, -...|
| [ 1.1, -...|
| [ 1.34, 0...|
| [ 1.64, 0...|
+--------------------+
only showing top 20 rows
Json 文件如下所示。
{
"time1":"2016-12-16T00:00:00.000",
"time2":"2016-12-16T23:59:59.000",
"step":0.5,
"xyz":[
{
"student":"0001025D0007F5DB",
"attr":[
[ -2.52, -1.17 ],
[ -2.3, -1.15 ],
[ -1.97, -1.19 ],
[ 10.16, 4.08 ],
[ 10.23, 4.87 ],
[ 9.96, 5.09 ] ]
},
{
"student":"0001025D0007F5DC",
"attr":[
[ -2.58, -0.99 ],
[ 10.12, 3.89 ],
[ 10.27, 4.59 ],
[ 10.05, 5.02 ] ]
}
]}
你能帮我解析这个并创建一个像这样的数据框吗?
Spark >= 2.2:
您可以对 JSON 使用 multiLine
参数 reader:
spark.read.json(path_to_input, multiLine=True)
Spark < 2.2
有几乎通用但相当昂贵的解决方案,可用于读取多行 JSON 文件:
- 使用
SparkContex.wholeTextFiles
读取数据。
- 放置密钥(文件名)。
- 将结果传递给
DataFrameReader.json
。
只要您的数据没有其他问题,它就可以解决问题:
spark.read.json(sc.wholeTextFiles(path_to_input).values())
我遇到过类似的问题。当 Spark 读取 Json 文件时,它希望每一行都是一个单独的 JSON 对象。因此,如果您尝试加载格式良好的 JSON 文件,它将失败。我绕过它是为了缩小 Spark 正在读取的 JSON 文件。
我是 Pyspark 的新手。我尝试使用以下代码
解析 JSON 文件from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.read.json("file:///home/malwarehunter/Downloads/122116-path.json")
df.printSchema()
输出结果如下
root |-- _corrupt_record: string (nullable = true)
df.show()
输出看起来像这样
+--------------------+
| _corrupt_record|
+--------------------+
| {|
| "time1":"2...|
| "time2":"201...|
| "step":0.5,|
| "xyz":[|
| {|
| "student":"00010...|
| "attr...|
| [ -2.52, ...|
| [ -2.3, -...|
| [ -1.97, ...|
| [ -1.27, ...|
| [ -1.03, ...|
| [ -0.8, -...|
| [ -0.13, ...|
| [ 0.09, -...|
| [ 0.54, -...|
| [ 1.1, -...|
| [ 1.34, 0...|
| [ 1.64, 0...|
+--------------------+
only showing top 20 rows
Json 文件如下所示。
{
"time1":"2016-12-16T00:00:00.000",
"time2":"2016-12-16T23:59:59.000",
"step":0.5,
"xyz":[
{
"student":"0001025D0007F5DB",
"attr":[
[ -2.52, -1.17 ],
[ -2.3, -1.15 ],
[ -1.97, -1.19 ],
[ 10.16, 4.08 ],
[ 10.23, 4.87 ],
[ 9.96, 5.09 ] ]
},
{
"student":"0001025D0007F5DC",
"attr":[
[ -2.58, -0.99 ],
[ 10.12, 3.89 ],
[ 10.27, 4.59 ],
[ 10.05, 5.02 ] ]
}
]}
你能帮我解析这个并创建一个像这样的数据框吗?
Spark >= 2.2:
您可以对 JSON 使用 multiLine
参数 reader:
spark.read.json(path_to_input, multiLine=True)
Spark < 2.2
有几乎通用但相当昂贵的解决方案,可用于读取多行 JSON 文件:
- 使用
SparkContex.wholeTextFiles
读取数据。 - 放置密钥(文件名)。
- 将结果传递给
DataFrameReader.json
。
只要您的数据没有其他问题,它就可以解决问题:
spark.read.json(sc.wholeTextFiles(path_to_input).values())
我遇到过类似的问题。当 Spark 读取 Json 文件时,它希望每一行都是一个单独的 JSON 对象。因此,如果您尝试加载格式良好的 JSON 文件,它将失败。我绕过它是为了缩小 Spark 正在读取的 JSON 文件。