JSON для набора данных в Spark

#apache-spark #apache-spark-sql #bigdata

#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)
  

Пожалуйста, помогите исправить это.

Пример 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"
    }]
  }
  

Ответ №1:

Ваш JSON должен быть в одной строке — один json в одной строке на один объект. В примере:

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

Он будет считан как Dataset с 2 объектами внутри и одним столбцом

Из документации:

Обратите внимание, что файл, который предлагается в виде файла json, не является обычным файлом JSON. Каждая строка должна содержать отдельный, автономный допустимый объект JSON. Как следствие, обычный многострочный файл JSON чаще всего завершается ошибкой.

Конечно, считывайте данные с помощью SparkSession, так как это приведет к выводу схемы

Комментарии:

1. @skjagini Да, теперь это изменилось. Спасибо, я забыл обновить ответ 🙂

Ответ №2:

Вы не можете прочитать форматированный JSON в spark, ваш 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, подобный этому :

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

Комментарии:

1. Так же, как и в моем ответе 😉