التحويل بين PySpark وpandas DataFrames
تعرف على كيفية تحويل Apache Spark DataFrames من وإلى Pandas DataFrames باستخدام سهم Apache في Azure Databricks.
سهم Apache وPyArrow
Apache سهم هو تنسيق بيانات عمودي في الذاكرة يستخدم في Apache Spark لنقل البيانات بكفاءة بين عمليات JVM وPython. هذا مفيد لمطوري Python الذين يعملون مع بيانات Pandas وNumPy. ومع ذلك، يتطلب استخدامه بعض التكوين الثانوي أو تغييرات التعليمات البرمجية لضمان التوافق والحصول على أكبر قدر من الفائدة.
PyArrow هو ربط Python ل Apache سهم ويتم تثبيته في Databricks Runtime. للحصول على معلومات حول إصدار PyArrow المتوفر في كل إصدار من إصدارات وقت تشغيل Databricks، راجع إصدارات ملاحظات إصدار Databricks Runtime والتوافق.
أنواع SQL المدعومة
يتم دعم جميع أنواع بيانات Spark SQL عن طريق التحويل المستند إلى الأسهم باستثناء ArrayType
TimestampType
. MapType
يتم دعم و ArrayType
من المتداخلة StructType
فقط عند استخدام PyArrow 2.0.0 وما فوق. StructType
يتم تمثيله ك pandas.DataFrame
بدلا من pandas.Series
.
تحويل PySpark DataFrames من وإلى Pandas DataFrames
يتوفر السهم كتحسين عند تحويل PySpark DataFrame إلى pandas DataFrame مع toPandas()
و عند إنشاء PySpark DataFrame من pandas DataFrame باستخدام createDataFrame(pandas_df)
.
لاستخدام السهم لهذه الطرق، قم بتعيين تكوين spark.sql.execution.arrow.pyspark.enabled
Spark إلى true
. يتم تمكين هذا التكوين بشكل افتراضي باستثناء مجموعات التزامن العالي بالإضافة إلى مجموعات عزل المستخدم في مساحات العمل التي تم تمكين كتالوج Unity.
بالإضافة إلى ذلك، يمكن أن تعود التحسينات التي تم تمكينها بواسطة spark.sql.execution.arrow.pyspark.enabled
إلى تنفيذ غير سهم إذا حدث خطأ قبل الحساب داخل Spark. يمكنك التحكم في هذا السلوك باستخدام تكوين spark.sql.execution.arrow.pyspark.fallback.enabled
Spark .
مثال
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()
يؤدي استخدام تحسينات الأسهم إلى نفس النتائج كما هو الحال عند عدم تمكين السهم. حتى مع السهم، toPandas()
ينتج عن جمع جميع السجلات في DataFrame إلى برنامج التشغيل ويجب أن يتم ذلك على مجموعة فرعية صغيرة من البيانات.
بالإضافة إلى ذلك، لا يتم دعم كافة أنواع بيانات Spark ويمكن رفع خطأ إذا كان العمود يحتوي على نوع غير معتمد. إذا حدث خطأ أثناء createDataFrame()
، يقوم Spark بإنشاء DataFrame بدون سهم.