Spark中的JSON到数据集

时间:2016-09-30 12:46:24

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

我正面临一个问题,我正在寻求你的帮助。我有一项任务是将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)

请帮助修复它。

Sample 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"
}]
}

2 个答案:

答案 0 :(得分:2)

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

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

它将被读作数据集,里面有两个对象,一列

来自documentation

  

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

当然使用SparkSession读取数据,因为它将推理模式

答案 1 :(得分:0)

你无法在火花中阅读格式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}