تحسين التحويل بين PySpark و Pandas DataFrames

Apache Arrow هو تنسيق بيانات عمودي في الذاكرة يستخدم في أباتشي سبارك لنقل البيانات بكفاءة بين عمليات JVM و Python. هذا مفيد لمطوري Python الذين يعملون مع الباندا وبيانات NumPy. ومع ذلك، استخدامه غير تلقائي ويتطلب بعض التغييرات الطفيفة على التكوين أو التعليمات البرمجية للاستفادة الكاملة وضمان التوافق.

إصدارات PyArrow

يتم تثبيت PyArrow في وقت تشغيل Databricks. للحصول على معلومات حول إصدار PyArrow المتوفرة في كل إصدار Databricks وقت التشغيل، راجع ملاحظات إصدار وقت التشغيل Databricks.

أنواع SQL المعتمدة

يتم اعتماد كافة أنواع بيانات Spark SQL بواسطة التحويل المستند إلى السهم باستثناء MapType ، و ، و ArrayTypeTimestampTypeStructType المتداخلة . StructType يمثل ك pandas.DataFrame بدلا من pandas.Series . BinaryType معتمد فقط عندما يكون PyArrow مساويا أو أعلى من 0.10.0.

تحويل PySpark DataFrames من وإلى pandas DataFrames

السهم هو متاح تعظيما عند تحويل PySpark DataFrame إلى باندا DataFrame مع toPandas() وعند إنشاء PySpark DataFrame من باندا DataFrame مع createDataFrame(pandas_df) . لاستخدام السهم لهذه الطرق، قم بتعيين تكوين Spark إلى true . يتم تعطيل هذا التكوين بشكل افتراضي.

بالإضافة إلى ذلك، يمكن أن تقع تحسينات تمكين بواسطة spark.sql.execution.arrow.enabled مرة أخرى إلى تطبيق غير السهم إذا حدث خطأ قبل الحساب داخل Spark. يمكنك التحكم في هذا السلوك باستخدام تكوين Spark spark.sql.execution.arrow.fallback.enabled .

مثال

import numpy as np
import pandas as pd

# Enable Arrow-based columnar data transfers
spark.conf.set("spark.sql.execution.arrow.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()

يؤدي استخدام تحسينات السهم إلى نفس النتائج التي ينتجها عند عدم تمكين Arrow. حتى مع Arrow، toPandas() ينتج عن ذلك جمع كافة السجلات في DataFrame إلى برنامج التشغيل وينبغي القيام به على مجموعة فرعية صغيرة من البيانات.

بالإضافة إلى ذلك، لا يتم دعم كافة أنواع بيانات Spark ويمكن رفع خطأ إذا كان العمود يحتوي على نوع غير معتمد. إذا حدث خطأ أثناء createDataFrame() ، يسقط Spark مرة أخرى لإنشاء DataFrame بدون سهم.