JSON 파일 읽기 및 쓰기

JSON(JavaScript 개체 표기법)은 데이터 교환 및 스토리지에 널리 사용되는 반구조화된 형식입니다. Azure Databricks 단일 줄 및 다중 줄 모드, 자동 스키마 유추 및 복구된 데이터를 포함하여 Apache Spark를 사용하여 읽고 쓰는 데 JSON을 지원합니다. Spark DataFrame API 또는 SQL을 사용하여 클라우드 스토리지에서 JSON 파일을 읽고 DataFrames를 JSON에 다시 쓸 수 있습니다.

사전 요구 사항

Azure Databricks JSON 파일을 사용하기 위해 추가 구성이 필요하지 않습니다.

옵션

JSON 데이터 원본을 구성하려면 .option().options()DataFrameReaderDataFrameWriter 메서드를 사용합니다. 지원되는 옵션의 전체 목록은 JSON 옵션 및 JSON 옵션을 참조DataFrameReader하세요.DataFrameWriter

Usage

다음 예제에서는 Wanderbricks 샘플 데이터 세트를 사용하여 Spark DataFrame API 및 SQL을 사용하여 한 줄 및 여러 줄 모드로 JSON 파일을 읽고 쓰는 방법을 보여 줍니다.

JSON 파일 작성 및 읽기

한 줄 모드(기본값)에서 출력의 각 줄에는 하나의 완전한 JSON 개체가 포함됩니다. Wanderbricks 리뷰를 JSON 형식으로 작성한 다음 다시 읽습니다.

파이썬

# Write wanderbricks reviews to JSON format
df = spark.read.table("samples.wanderbricks.reviews")
df.write.format("json").save("/Volumes/<catalog>/<schema>/<volume>/reviews_json")

# Read the JSON files into a DataFrame
df = spark.read.format("json").load("/Volumes/<catalog>/<schema>/<volume>/reviews_json")
df.printSchema()
display(df)

스칼라

// Write wanderbricks reviews to JSON format
val reviews = spark.read.table("samples.wanderbricks.reviews")
reviews.write.format("json").save("/Volumes/<catalog>/<schema>/<volume>/reviews_json")

// Read the JSON files into a DataFrame
val df = spark.read.format("json").load("/Volumes/<catalog>/<schema>/<volume>/reviews_json")
df.printSchema()
df.show()

여러 줄 JSON 파일 읽기

여러 줄 모드에서 단일 JSON 개체는 여러 줄에 걸쳐 있습니다. 레코드가 여러 줄에 걸쳐 서식이 지정된 JSON 파일을 읽으려면 여러 줄 모드를 사용하도록 설정합니다.

파이썬

mdf = spark.read.option("multiline", "true").format("json").load("/Volumes/<catalog>/<schema>/<volume>/multi-line.json")
mdf.show(truncate=False)

스칼라

val mdf = spark.read.option("multiline", "true").format("json").load("/Volumes/<catalog>/<schema>/<volume>/multi-line.json")
mdf.show(false)

SQL

CREATE TEMPORARY VIEW multiLineJsonTable
USING json
OPTIONS (path="/Volumes/<catalog>/<schema>/<volume>/multi-line.json",multiline=true)

SQL을 사용하여 JSON 파일 읽기

SQL에서 read_files 테이블 반환 함수 테이블 반환 함수를 사용하여 JSON 파일을 읽을 수 있습니다.

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/reviews_json',
  format => 'json',
  multiLine => true)

JSON 파일을 읽는 데 사용할 USING JSON 수도 있습니다. 그러나 Databricks는 스키마 및 추가 파일 처리 옵션의 read_files 사양을 허용하기 때문에 USING JSON 대신 사용하는 read_files 것이 좋습니다.

DROP TABLE IF EXISTS reviews_json_table;

CREATE TABLE reviews_json_table
USING JSON
OPTIONS (path "/Volumes/<catalog>/<schema>/<volume>/reviews_json", multiline true);

SELECT * FROM reviews_json_table;

문자 인코딩 지정

기본적으로 입력 파일의 문자 집합은 자동으로 감지됩니다. charset 옵션을 사용하여 문자 집합을 명시적으로 지정할 수 있습니다.

파이썬

spark.read.option("charset", "UTF-16BE").format("json").load("/Volumes/<catalog>/<schema>/<volume>/fileInUTF16.json")

스칼라

spark.read.option("charset", "UTF-16BE").format("json").load("/Volumes/<catalog>/<schema>/<volume>/fileInUTF16.json")

SQL

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/fileInUTF16.json',
  format => 'json',
  charset => 'UTF-16BE'
)

지원되는 문자 집합의 예는 UTF-8, UTF-16BE, UTF-16LE, UTF-16, UTF-32BE, UTF-32LE, UTF-32입니다. Oracle Java SE에서 지원하는 전체 문자 집합을 보려면 Supported Encodings(지원되는 인코딩)를 참조하세요.

복구된 데이터 열 활성화

구조된 데이터 열은 ETL 중에 데이터가 손실되지 않도록 합니다. 레코드의 하나 이상의 필드에 다음 문제 중 하나가 있으므로 구문 분석되지 않은 모든 데이터를 캡처합니다.

  • 제공된 스키마에 누락되었습니다.
  • 제공된 스키마의 데이터 형식과 일치하지 않습니다.
  • 제공된 스키마의 필드 이름과 대소문자가 일치하지 않는 부분이 있습니다.

복구된 데이터 열은 복구된 열 데이터 및 레코드의 원본 파일 경로를 포함하는 JSON 블롭으로 반환됩니다.

복구 데이터 열을 사용 설정하려면 읽을 때 rescuedDataColumn 옵션을 열 이름으로 설정하세요:

파이썬

df = spark.read.option("rescuedDataColumn", "_rescued_data").format("json").load("/Volumes/<catalog>/<schema>/<volume>/reviews_json")

스칼라

val df = spark.read.option("rescuedDataColumn", "_rescued_data").format("json").load("/Volumes/<catalog>/<schema>/<volume>/reviews_json")

SQL

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/reviews_json',
  format => 'json',
  rescuedDataColumn => '_rescued_data'
)

복구된 데이터 열에서 원본 파일 경로를 제거하려면 다음을 설정합니다.

spark.conf.set("spark.databricks.sql.rescuedDataColumn.filePath.enabled", "false")

JSON 파서는 레코드를 구문 분석할 때 PERMISSIVE, DROPMALFORMEDFAILFAST 등, 세 가지 모드를 지원합니다. 함께 rescuedDataColumn사용하는 경우 다음 규칙이 적용됩니다.

  • 데이터 형식 불일치로 인해 DROPMALFORMED 모드에서 레코드가 누락되거나 FAILFAST 모드에서 오류가 발생하지 않습니다.
  • 손상된 레코드, 즉 불완전하거나 형식이 잘못된 JSON만 제외되거나 오류가 발생합니다.
  • badRecordsPath 옵션을 사용하는 경우 데이터 형식 불일치는 잘못된 레코드로 간주되지 않습니다. 불완전하고 형식이 잘못된 JSON 레코드만 badRecordsPath에 저장됩니다.

추가 리소스

  • Parquet 파일 읽기 및 쓰기: 워크로드가 주로 분석적이고 읽기가 많은 경우 Parquet의 열 형식 레이아웃은 JSON의 행 기반 텍스트 형식보다 더 효율적인 쿼리 성능을 제공합니다.
  • Avro 파일 읽기 및 쓰기: Apache Kafka와 같은 이벤트 스트리밍 시스템에서 JSON을 생성하거나 사용하는 경우 Avro는 스키마 진화 지원을 통해 보다 컴팩트한 이진 인코딩을 제공합니다.