التحويل بين 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 عن طريق التحويل المستند إلى الأسهم باستثناء MapType، ArrayTypeTimestampTypeو، و المتداخلة StructType. StructType يتم تمثيله ك pandas.DataFrame بدلا من pandas.Series. BinaryType معتمد فقط لإصدارات PyArrow 0.10.0 والإصدارات الأحدث.

تحويل 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.enabledSpark .

مثال

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 بدون سهم.