【版权声明】版权所有,严禁转载,严禁用于商业用途,侵权必究。
相关教材:林子雨、郑海山、赖永炫编著《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"
)