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