#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. Так же, как и в моем ответе 😉