启用pyarrow可以加快pyspark与pandas的数据传输效率。
代码&错误信息:
如下代码会报错:
# spark初始化
spark = SparkSession \
.builder.master("local") \
.appName("IForestExample") \
.config("spark.sql.execution.arrow.enabled", "true")\
.getOrCreate()
pdf = pd.DataFrame(np.random.rand(100000, 3))
# pdf -> sdf
%time df = spark.createDataFrame(pdf)
# sdf -> pdf
%time result_pdf = df.select('*').toPandas()
错误如下:
版本信息:
pyspark=2.4.3
pyarrow=0.13.0
Trouble shoting:
跟踪了一下代码,发现sock_info由三个值组成,但是local_connect_and_auth只接受两个参数
网上的参考资料:https://github.com/apache/spark/pull/24834
sock_info包含了三个值:port, auth_secret, server,但是大部分应用都只需要前两个。
所以可以修改/usr/local/lib/python3.6/dist-packages/pyspark/rdd.py如下:
从sock_info里取出前两个值,作为local_connect_and_auth里作为参数。可以运行了。
效果对比
不使用pyarrow:
使用pyarrow:
从pandas df 到spark df效率提升了50倍,从spark df到pandas df效率提升了10倍左右。
mmlspark中的docker不用修改直接运行也正常
从mmlspark直接来下来的docker mcr.microsoft.com/mmlspark/release, 不用修改rdd.py直接运行没问题。
且pyspark和pyarrow的版本也是2.4.3和0.13。不知道原因。