【问题标题】:Formatting JSON files for SQLContext为 SQLContext 格式化 JSON 文件
【发布时间】:2015-12-22 16:13:52
【问题描述】:

我在加载依赖于输入 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 对象”

如果我按照上面的这种样式格式化,事情会按预期工作。但是,我在几行上手动制作了这些模组。我无法对整个数据集执行此操作,因此请寻找现有的脚本或工具。

如果这是一个更好的选择,我可以加载到可用的 JDBC 数据库。想法?

提前致谢

【问题讨论】:

    标签: json apache-spark apache-spark-sql


    【解决方案1】:

    您可以先使用sc.wholeTextFiles() 将JSON 文件加载到RDD 中并删除文件名列,然后运行SQLContext 读取RDD 内容。

    例如

    val jsonRdd = sc.wholeTextFiles("samplefile.json").map(x => x._2)
    val jsonDf = sqlContext.read.json(jsonRdd)
    

    【讨论】:

    • 我应该提到,您可以通过将通配符传递给 wholeTextFiles 在多个文件上运行它,其余的应该按原样工作。
    【解决方案2】:

    如果你通过添加方括号将它变成一个数组会怎样。像这样;

      [
        {
        "Year": "2013",
        "FName": "DAVID",
        "County": "KINGS",
        "Sex": "M",
        "Count": "272"
        },
        {
        "Year": "2013",
        "FName": "JAYDEN",
        "County": "KINGS",
        "Sex": "M",
        "Count": "268"
        }
        ]
    

    如果我获取您的文件并添加括号,我可以使用 Node.js 遍历它并输出一个看起来像您想要的文件。 node.js 中的警告是我不能有变量 First Name - 我必须将其更改为 FName。

    【讨论】:

    • 这与node无关。 Apache Spark 存在多行 JSON 问题,OP 想知道如何解决该问题并确保 Spark 接受有效的多行 JSON
    猜你喜欢
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    相关资源
    最近更新 更多