使用arraytype列将udf重写为pandas udf

yizd12fk  于 2021-05-17  发布在  Spark
关注(0)|答案(1)|浏览(623)

我想把一个自定义项改写成Pandas自定义项。
但是,当涉及到包含arraytype的列时。我正在努力寻找正确的解决办法。
我有一个Dataframe如下:

+-----------+--------------------+
|      genre|                 ids|
+-----------+--------------------+
|      Crime|[6, 22, 42, 47, 5...|
|    Romance|[3, 7, 11, 15, 17...|
|   Thriller|[6, 10, 16, 18, 2...|
|  Adventure|[2, 8, 10, 15, 29...|
|   Children|[1, 2, 8, 13, 34,...|
|      Drama|[4, 11, 14, 16, 1...|
|        War|[41, 110, 151, 15...|
|Documentary|[37, 77, 99, 108,...|
|    Fantasy|[2, 56, 60, 126, ...|
|    Mystery|[59, 113, 123, 16...|
+-----------+--------------------+

以下自定义项效果良好:

pairs_udf = udf(lambda x: itertools.combinations(x, 2), transformer.schema)
df = df.select("genre", pairs_udf("ids").alias("ids"))

输出如下:

+-----------+--------------------+
|      genre|                 ids|
+-----------+--------------------+
|      Crime|[[6, 22], [6, 42]...|
|    Romance|[[3, 7], [3, 11],...|
|   Thriller|[[6, 10], [6, 16]...|
|  Adventure|[[2, 8], [2, 10],...|
|   Children|[[1, 2], [1, 8], ...|
|      Drama|[[4, 11], [4, 14]...|
|        War|[[41, 110], [41, ...|
|Documentary|[[37, 77], [37, 9...|
|    Fantasy|[[2, 56], [2, 60]...|
|    Mystery|[[59, 113], [59, ...|
+-----------+--------------------+

但是,在中编写函数时,什么是等价的 pandas udf .
ps:我明白,或者,我可以使用交叉连接来实现相同的结果。
但是,我更好奇的是,pandas udf如何使用arraytype处理列。

bzzcjhmw

bzzcjhmw1#

我将在这里分享我的发现:
有三个方面可以使Pandas自定义项在您的项目中发挥作用:

1. pandas udf,或者更准确地说,apachearrow不支持复杂类型作为普通udf剂量

例如。: ArrayType(StringType()) 由Pandas自定义项支持。 ArrayType(SturctType([...])) 不支持。您可以查看更多:https://spark.apache.org/docs/latest/sql-pyspark-pandas-with-arrow.html#supported-sql类型

2. 如果您运行的是java11,这是(py)spark3中的默认值。您需要在spark配置中添加以下内容:

spark.driver.extraJavaOptions='-Dio.netty.tryReflectionSetAccessible=true'
spark.executor.extraJavaOptions='-Dio.netty.tryReflectionSetAccessible=true'

这将解决问题 java.lang.UnsupportedOperationException 如上所述。

3. 确保将虚拟环境python路径添加到python中

即。 environ['PYSPARK_PYTHON']='./your/virutal/enviroment/path'

相关问题