У меня есть большой вложенный NDJ (новый файл с разделителями строк JSON), который мне нужно прочитать в единый блок данных искры и сохранить паркет. В попытке оказать схему я использую эту функцию:Чтение массивных файлов JSON в Spark Dataframe
def flattenSchema(schema: StructType, prefix: String = null) : Array[Column] = {
schema.fields.flatMap(f => {
val colName = if (prefix == null) f.name else (prefix + "." + f.name)
f.dataType match {
case st: StructType => flattenSchema(st, colName)
case _ => Array(col(colName))
}
})
}
на dataframe, возвращенного считывании
val df = sqlCtx.read.json(sparkContext.wholeTextFiles(path).values)
Я также переключился это val df = spark.read.json(path)
так, что это работает только с NDJ, а не с несколькими линиями JSON - та же ошибка.
Это вызывает ошибку в памяти для рабочих java.lang.OutOfMemoryError: Java heap space
.
Я изменил параметры JVM памяти и параметры искровой исполнитель/водитель но безрезультатно
Есть ли способ, чтобы поток файла, придавить схемы, и добавить к dataframe пошагово? Некоторые строки JSON содержат новые поля из предыдущего, поэтому они должны быть заполнены позже.
Как он обращается к 'java.lang.OutOfMemoryError' в результате' wholeTextFiles'? –
Я обращался к «Есть ли способ потокового файла, сгладить схему и постепенно добавлять к фреймворку данных? Некоторые строки JSON содержат новые поля из предыдущего, поэтому они должны быть заполнены позже. ». Я не вижу вопроса о разрешении проблемы с памятью. Поэтому он дал ему несколько подходов. – Ramzy
Если NDJ является JSONL, то OP не должен использовать wholeTextFiles. Если это не так, это не поможет. –