借助于Arrow实现PySpark和Pandas之间的数据交换

大数据学习路线图

【版权声明】版权所有,严禁转载,严禁用于商业用途,侵权必究。
相关教材:林子雨、郑海山、赖永炫编著《Spark编程基础(Python版)》(访问教材官网
Apache Arrow是一个高效的列式数据格式,可以在PySpark中实现JVM和Python进程之间的数据交换。这对于使用Numpy和Pandas的Python用户来说,是可以带来很多好处的。不过,它的使用并不是自动发生的,而是需要经过一些安装和配置工作。

一、安装Apache PyArrow

在PySpark中使用Arrow,需要安装PyArrow。PyArrow目前(2020年6月)和Python 3.5, 3.6, 3.7以及3.8保持兼容。

(1)方法1:使用Conda安装PyArrow

可以执行如下命令,安装最新版本的PyArrow:

conda install -c conda-forge pyarrow

(2)方法2:使用pip安装PyArrow

可以执行如下命令,安装最新版本的PyArrow:

pip install pyarrow

二、Spark DataFrame和Pandas DataFrame之间的数据交换

当需要把Spark DataFrame转换成Pandas DataFrame时,可以调用toPandas();当需要从Pandas DataFrame创建Spark DataFrame时,可以采用createDataFrame(pandas_df)。但是,需要注意的是,在调用这些操作之前,需要首先把Spark的参数spark.sql.execution.arrow.enabled设置为true,因为这个参数在默认情况下是false。
下面是一个参考实例代码:

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()

下面是另外一段代码,也是实现了Spark DataFrame和Pandas DataFrame之间的数据交换,供参考:

import pandas as pd
from pyspark.sql import SparkSession
spark= SparkSession\
                .builder \
                .appName("Dataframe") \
                .getOrCreate() 

data=pd.DataFrame([[1,2],[3,4]],columns=['a','b'])
data_values=data.values.tolist()
data_coulumns=list(data.columns)
df=spark.createDataFrame(data) 

#将pandas.DataFrame转为spark.dataFrame
spark_df  = spark.createDataFrame(data_values, data_coulumns)
print('spark.dataFram=',spark_df.show()) 

#将spark.dataFrame转为pandas.DataFrame  
Spark.conf.set(“spark.sql.execution.arrow.enabled”,”true")
pandas_df = spark_df.toPandas()  
print('pandas.DataFrame=',pandas_df) 

#将spark.dataFrame存入hive
spark_df.createOrReplaceTempView('table_test')
spark.sql(
"create table tmp.table_test SELECT * FROM table_test"
)