Tôi có tệp NDJ lồng nhau lớn (JSON phân tách dòng mới) mà tôi cần đọc vào một khung dữ liệu tia lửa đơn và lưu vào sàn gỗ. Trong một nỗ lực để làm cho schema tôi sử dụng chức năng này:Đọc các tệp JSON lớn vào Khung dữ liệu Spark
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))
}
})
}
trên dataframe được trả về bằng cách đọc bởi
val df = sqlCtx.read.json(sparkContext.wholeTextFiles(path).values)
Tôi cũng đã chuyển này để val df = spark.read.json(path)
để chỉ tác phẩm này với NDJ và không phải là nhiều dòng JSON - cùng một lỗi.
Điều này gây ra lỗi bộ nhớ trên công nhân java.lang.OutOfMemoryError: Java heap space
.
Tôi đã thay đổi các tùy chọn bộ nhớ JVM và các tùy chọn spark người thi hành/điều khiển vô ích
Có cách nào để dòng tập tin, san bằng lược đồ, và thêm vào một dataframe từng bước? Một số dòng của JSON chứa các trường mới từ các entires trước đó ... vì vậy chúng sẽ cần được điền vào sau.
Làm cách nào để giải quyết 'java.lang.OutOfMemoryError' là kết quả của' toàn tập tinFiles'? –
Tôi đã giải quyết "Có cách nào để truyền tệp, làm phẳng lược đồ, và thêm vào một khung dữ liệu từng bước? Một số dòng của JSON chứa các trường mới từ các entires trước đó ... vì vậy chúng sẽ được điền vào sau. ". Tôi không thấy câu hỏi nào liên quan đến độ phân giải vấn đề bộ nhớ. Vì vậy, đã cho anh ta nhiều cách tiếp cận. – Ramzy
Nếu NDJ là JSONL thì OP không nên sử dụng hàm fullTextFiles. Nếu nó không phải là điều này sẽ không giúp đỡ. –