source

Apache Spark에서 여러 줄의 JSON 읽기

bestscript 2023. 2. 8. 19:43

Apache Spark에서 여러 줄의 JSON 읽기

JSON 파일을 작은 DB로 사용하려고 했습니다.DataFrame에 템플릿 테이블을 작성한 후 SQL로 조회하여 예외를 받았습니다.코드는 다음과 같습니다.

val df = sqlCtx.read.json("/path/to/user.json")
df.registerTempTable("user_tt")

val info = sqlCtx.sql("SELECT name FROM user_tt")
info.show()

df.printSchema()결과:

root
 |-- _corrupt_record: string (nullable = true)

내 JSON 파일:

{
  "id": 1,
  "name": "Morty",
  "age": 21
}

설명:

Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve 'name' given input columns: [_corrupt_record];

어떻게 하면 고칠 수 있죠?

업데이트

_corrupt_record

+--------------------+
|     _corrupt_record|
+--------------------+
|                   {|
|            "id": 1,|
|    "name": "Morty",|
|           "age": 21|
|                   }|
+--------------------+

UPD2

이상하지만 JSON을 다시 쓰면 온라이너로 만들 수 있어요.

{"id": 1, "name": "Morty", "age": 21}

그래서 문제는newline.

UPD3

나는 다음 문장을 문서에서 찾았다.

json 파일로 제공되는 파일은 일반적인 JSON 파일이 아닙니다.각 행에는 독립된 유효한 JSON 개체가 포함되어 있어야 합니다.그 결과, 통상의 복수 행의 JSON 파일에 장해가 발생하는 경우가 대부분입니다.

JSON을 이러한 형식으로 유지하는 것은 편리하지 않습니다.JSON의 멀티라인 구조를 없애거나 oneliner로 변환할 수 있는 방법이 있습니까?

스파크 > = 2.2

Spark 2.2 도입 multiLineJSONL이 아닌 JSON 파일을 로드하는 데 사용할 수 있는 옵션:

spark.read
  .option("multiLine", true).option("mode", "PERMISSIVE")
  .json("/path/to/user.json")

참조:

  • SPARK-18352 - 일반 멀티라인 JSON 파일을 해석합니다(JSON 회선뿐만이 아닙니다).
  • SPARK-20980 - 옵션 이름을 JSON 및 CSV용으로 변경합니다.

스파크 < 2.2

글쎄요, JSONL 형식의 데이터를 사용하는 것은 불편할 수 있지만 API의 문제가 아니라 형식 자체의 문제라고 주장하겠습니다.JSON은 단순히 분산 시스템에서 병렬로 처리되도록 설계되지 않았습니다.

스키마를 제공하지 않으며 형식 및 모양에 대한 매우 구체적인 가정을 하지 않으면 최상위 문서를 올바르게 식별하는 것이 거의 불가능합니다.Apache Spark와 같은 시스템에서 사용하는 것은 상상할 수 있는 최악의 형식입니다.또한 분산형 시스템에서 유효한 JSON을 쓰는 것은 매우 까다롭고 일반적으로 실용적이지 않습니다.

즉, 개별 파일이 유효한 JSON 문서(단일 문서 또는 문서 배열)인 경우 언제든지 시도할 수 있습니다.wholeTextFiles:

spark.read.json(sc.wholeTextFiles("/path/to/user.json").values())

0323의 답변에 덧붙이자면 Spark 2.2+의 멀티라인 JSON 읽기 옵션은 다음과 같이 이름이 변경되었습니다.multiLine(여기서 Spark 매뉴얼을 참조하십시오).

따라서 올바른 구문은 다음과 같습니다.

spark.read
  .option("multiLine", true).option("mode", "PERMISSIVE")
  .json("/path/to/user.json")

이 문제는 https://issues.apache.org/jira/browse/SPARK-20980에서 발생했습니다.

언급URL : https://stackoverflow.com/questions/38545850/read-multiline-json-in-apache-spark