Bagikan melalui


Mengonversi antara PySpark dan pandas DataFrames

Pelajari cara mengonversi Apache Spark DataFrames ke dan dari pandas DataFrames menggunakan Apache Arrow di Azure Databricks.

Panah Apache dan PyArrow

Apache Arrow adalah format data berkolom dalam memori yang digunakan dalam Apache Spark untuk mentransfer data secara efisien antara proses JVM dan Python. Hal ini bermanfaat bagi pengembang Python yang bekerja dengan panda dan data NumPy. Namun, penggunaannya memerlukan beberapa konfigurasi kecil atau perubahan kode untuk memastikan kompatibilitas dan mendapatkan manfaat paling besar.

PyArrow adalah pengikatan Python untuk Apache Arrow dan diinstal di Databricks Runtime. Untuk informasi tentang versi PyArrow yang tersedia di setiap versi Databricks Runtime, lihat versi dan kompatibilitas catatan rilis Databricks Runtime.

Tipe SQL yang Didukung

Semua jenis data Spark SQL didukung oleh konversi berbasis Arrow kecuali ArrayTypeTimestampType. MapType dan ArrayType berlapis StructType hanya didukung saat menggunakan PyArrow 2.0.0 ke atas. StructType diwakili sebagai pandas.DataFrame bukan pandas.Series.

Konversi PySpark DataFrames ke dan dari pandas DataFrames

Arrow tersedia sebagai pengoptimalan saat mengonversi PySpark DataFrame ke pandas DataFrame dengan toPandas() dan saat membuat PySpark DataFrame dari pandas DataFrame dengan createDataFrame(pandas_df).

Untuk menggunakan Arrow untuk metode ini, atur konfigurasi Spark spark.sql.execution.arrow.pyspark.enabled ke true. Konfigurasi ini diaktifkan secara default kecuali untuk kluster Konkurensi Tinggi serta kluster isolasi pengguna di ruang kerja yang mengaktifkan Katalog Unity.

Selain itu, pengoptimalan yang diaktifkan oleh spark.sql.execution.arrow.pyspark.enabled dapat kembali ke implementasi non-Arrow jika terjadi kesalahan sebelum komputasi dalam Spark. Anda dapat mengontrol perilaku ini menggunakan konfigurasi Spark spark.sql.execution.arrow.pyspark.fallback.enabled.

Contoh

import numpy as np
import pandas as pd

# Enable Arrow-based columnar data transfers
spark.conf.set("spark.sql.execution.arrow.pyspark.enabled", "true")

# Generate a pandas DataFrame
pdf = pd.DataFrame(np.random.rand(100, 3))

# Create a Spark DataFrame from a pandas DataFrame using Arrow
df = spark.createDataFrame(pdf)

# Convert the Spark DataFrame back to a pandas DataFrame using Arrow
result_pdf = df.select("*").toPandas()

Menggunakan pengoptimalan Arrow menghasilkan hasil yang sama seperti saat Arrow tidak diaktifkan. Bahkan dengan Arrow, toPandas() menghasilkan pengumpulan semua catatan di DataFrame ke program driver dan harus dilakukan pada subset kecil data.

Selain itu, tidak semua jenis data Spark didukung dan kesalahan dapat dimunculkan jika kolom memiliki jenis yang tidak didukung. Jika terjadi kesalahan selama createDataFrame(), Spark membuat DataFrame tanpa Panah.