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 ArrayType
TimestampType
.
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.