我在加载依赖于输入JSON文件格式的JSON时遇到问题。
根据JSON数据集上的Spark文档,输入文件中的每一行必须是有效的JSON对象。重新:
“请注意,作为json文件提供的文件不是典型的JSON文件。每行必须包含一个单独的,自包含的有效JSON对象。因此,常常的多行JSON文件将最常见失败“。
所以,如果我有一个输入JSON文件,如:
{
"Year": "2013",
"First Name": "DAVID",
"County": "KINGS",
"Sex": "M",
"Count": "272"
},
{
"Year": "2013",
"First Name": "JAYDEN",
"County": "KINGS",
"Sex": "M",
"Count": "268"
}
是否有任何现有工具或脚本可转换为:
{"Year": "2013","First Name": "DAVID","County": "KINGS","Sex": "M","Count":"272"},
{"Year": "2013","First Name": "JAYDEN","County": "KINGS","Sex": "M","Count": "268"}
JSON符合“每行必须包含一个单独的,自包含的有效JSON对象”
如果我格式化为上面的这种风格,事情会按预期工作。但是,我在几行上手动制作了这些mod。我无法对整个数据集执行此操作,因此需要查找现有脚本或工具。
OR
如果这是一个更好的选择,我可以加载到JDBC可用数据库。想法?
提前致谢
答案 0 :(得分:3)
您可以先使用sc.wholeTextFiles()
将JSON文件加载到RDD中,然后删除文件名列,然后对RDD内容运行SQLContext
读取。
e.g。
val jsonRdd = sc.wholeTextFiles("samplefile.json").map(x => x._2)
val jsonDf = sqlContext.read.json(jsonRdd)
答案 1 :(得分:-1)
如果通过添加方括号将其设为数组,该怎么办?像这样;
[
{
"Year": "2013",
"FName": "DAVID",
"County": "KINGS",
"Sex": "M",
"Count": "272"
},
{
"Year": "2013",
"FName": "JAYDEN",
"County": "KINGS",
"Sex": "M",
"Count": "268"
}
]
如果我拿走你的文件并添加括号,我可以用Node.js迭代它并输出一个看起来像你想要的文件。 node.js中的警告是我无法使用变量名字 - 我必须将其更改为FName。