【问题标题】:JSON to dataset in SparkJSON 到 Spark 中的数据集
【发布时间】:2016-09-30 12:46:23
【问题描述】:

我遇到了一个问题,正在寻求您的帮助。我的任务是将JSON 文件转换为dataSet,以便可以将其加载到HIVE。

代码 1

    SparkSession spark1 = SparkSession
                  .builder()
                  .appName("File_Validation")
                  .config("spark.some.config.option", "some-value")
                  .getOrCreate();
    Dataset<Row> df = spark1.read().json("input/sample.json");
    df.show();

上面的代码给我一个 NullPointerException。 我尝试了另一种方法

代码 2

    JavaRDD<String> jsonFile = context.textFile("input/sample.json");
        Dataset<Row> df2 = spark1.read().json(jsonFile);
    df2.show();

创建一个 RDD 并将其传递给 spark1 (sparkSession)

此代码 2 将 json 制作成另一种格式,标题为

 +--------------------+
 |     _corrupt_record|
 +--------------------+

with schema as - |-- _corrupt_record: string (nullable = true)

请帮忙修复它。

示例 JSON

  {
    "user": "gT35Hhhre9m",
    "dates": ["2016-01-29", "2016-01-28"],
    "status": "OK",
    "reason": "some reason",
    "content": [{
        "foo": 123,
        "bar": "val1"
    }, {
        "foo": 456,
        "bar": "val2"
    }, {
        "foo": 789,
        "bar": "val3"
    }, {
        "foo": 124,
        "bar": "val4"
    }, {
        "foo": 126,
        "bar": "val5"
    }]
  }

【问题讨论】:

    标签: apache-spark apache-spark-sql bigdata


    【解决方案1】:

    您的 JSON 应该在一行中 - 每个对象在一行中一个 json。 例如:

    { "property1: 1 }
    { "property1: 2 }
    

    它将被读取为数据集,其中包含 2 个对象和一列

    来自documentation:

    请注意,作为 json 文件提供的文件不是典型的 JSON 文件。每行必须包含一个单独的、自包含的有效 JSON 对象。因此,一个常规的多行 JSON 文件将 最常失败。

    当然是用 SparkSession 读取数据,因为它会推断架构

    【讨论】:

    • @skjagini 是的,现在它已经改变了。谢谢,我忘了更新答案:)
    【解决方案2】:

    您无法在 spark 中读取格式化的 JSON,您的 JSON 应该在 single line 中,如下所示:

    {"user": "gT35Hhhre9m","dates": ["2016-01-29", "2016-01-28"],"status": "OK","reason": "some reason","content": [{"foo": 123,"bar": "val1"}, {"foo": 456,"bar": "val2"}, {"foo": 789,"bar": "val3"}, {"foo": 124,"bar": "val4"}, {"foo": 126,"bar": "val5"}]}
    

    或者它可以是多行 JSON like 这个:

    {"name":"Michael"}
    {"name":"Andy", "age":30}
    {"name":"Justin", "age":19}
    

    【讨论】:

    • 就像我的回答一样 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    相关资源
    最近更新 更多