Membaca dan menulis file JSON

JSON (JavaScript Object Notation) adalah format semi terstruktur yang banyak digunakan untuk pertukaran data dan penyimpanan. Azure Databricks mendukung JSON untuk membaca dan menulis dengan Apache Spark, termasuk mode baris tunggal dan multibaris, inferensi skema otomatis, dan data yang diselamatkan. Anda dapat membaca file JSON dari penyimpanan cloud menggunakan Spark DataFrame API atau SQL, dan menulis DataFrames kembali ke JSON.

Prasyarat

Azure Databricks tidak memerlukan konfigurasi tambahan untuk menggunakan file JSON.

Opsi

.option() Gunakan metode .options() dan DataFrameReader dan DataFrameWriter untuk mengonfigurasi sumber data JSON. Untuk daftar lengkap opsi yang didukung, lihat DataFrameReader Opsi JSON dan DataFrameWriter opsi JSON.

Usage

Contoh berikut menggunakan himpunan data sampel Wanderbricks untuk menunjukkan pembacaan dan penulisan file JSON dalam mode satu baris dan multibaris menggunakan Spark DataFrame API dan SQL.

Menulis dan membaca file JSON

Dalam mode baris tunggal (default), setiap baris output berisi satu objek JSON lengkap. Tulis ulasan Wanderbricks ke format JSON, lalu baca kembali.

Python

# 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)

Scala

// 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()

Membaca file JSON beberapa baris

Dalam mode multibaris, satu objek JSON dapat mencakup beberapa baris. Aktifkan mode multibaris untuk membaca file JSON tempat rekaman diformat di beberapa baris.

Python

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

Scala

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)

Membaca file JSON menggunakan SQL

Anda dapat menggunakan read_files fungsi bernilai tabel fungsi bernilai tabel di SQL untuk membaca file JSON.

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

Anda juga dapat menggunakan USING JSON untuk membaca file JSON. Namun, Databricks merekomendasikan penggunaan read_files alih-alih USING JSON karena read_files memungkinkan spesifikasi skema dan opsi pemrosesan file tambahan.

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;

Tentukan pengodean karakter

Secara default, tataan karakter file input terdeteksi secara otomatis. Anda dapat menentukan tataan karakter secara eksplisit dengan menggunakan opsi charset:

Python

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

Scala

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'
)

Beberapa tataan karakter yang didukung meliputi: UTF-8, UTF-16BE, UTF-16LE, UTF-16, UTF-32BE, UTF-32LE, UTF-32. Untuk daftar lengkap charset yang didukung oleh Oracle Java SE, lihat Pengodean yang Didukung.

Mengaktifkan kolom data yang diselamatkan

Kolom data yang diselamatkan memastikan bahwa Anda tidak pernah kehilangan data selama ETL. Ini menangkap data apa pun yang tidak diurai karena satu atau beberapa bidang dalam rekaman memiliki salah satu masalah berikut:

  • Tidak ada dalam skema yang disediakan.
  • Tidak cocok dengan jenis data skema yang disediakan.
  • Memiliki ketidakcocokan kasus dengan nama bidang dalam skema yang disediakan.

Kolom data yang diselamatkan dikembalikan sebagai blob JSON yang berisi kolom yang diselamatkan dan jalur file sumber rekaman.

Untuk mengaktifkan kolom data yang diselamatkan, atur opsi rescuedDataColumn menjadi nama kolom saat membaca:

Python

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

Scala

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'
)

Untuk menghapus jalur file sumber dari kolom data yang diselamatkan, atur:

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

Pengurai JSON mendukung tiga mode saat mengurai baris: PERMISSIVE, DROPMALFORMED, dan FAILFAST. Saat digunakan bersama dengan rescuedDataColumn, aturan berikut berlaku:

  • Ketidakcocokan jenis data tidak menyebabkan rekaman dihilangkan dalam DROPMALFORMED mode atau melemparkan kesalahan dalam FAILFAST mode.
  • Hanya rekor yang korup—yaitu JSON yang tidak lengkap atau cacat—yang dihilangkan atau menimbulkan kesalahan.
  • Jika Anda menggunakan opsi , badRecordsPath ketidakcocokan jenis data tidak dianggap sebagai catatan buruk. Hanya catatan JSON yang tidak lengkap dan cacat yang disimpan di badRecordsPath.

Sumber daya tambahan

  • Membaca dan menulis file Parquet: Jika beban kerja Anda terutama analitik dan baca-berat, tata letak kolom Parquet menawarkan performa kueri yang lebih efisien daripada format teks berbasis baris JSON.
  • Membaca dan menulis file Avro: Jika Anda memproduksi atau mengonsumsi JSON dari sistem streaming peristiwa seperti Apache Kafka, Avro menyediakan pengodean biner yang lebih ringkas dengan dukungan evolusi skema.