【发布时间】:2019-02-26 01:51:23
【问题描述】:
我正在尝试制作一个 pandas UDF,它接收具有整数值的两列,并根据这些值之间的差异返回一个长度等于上述差异的小数数组。
到目前为止,这是我的尝试,我一直在用很多不同的方法来尝试让它发挥作用,但这是总体思路
import pandas as pd
@pandas_udf(ArrayType(DecimalType()), PandasUDFType.SCALAR)
def zero_pad(x, y):
buffer = []
for i in range(0, (x - y)):
buffer.append(0.0)
return buffer #correction provided by Ali Yessili
这是我如何使用它的示例
df = df.withColumn("zero_list", zero_pad(df.x, df.y))
最终结果是 df,其中一个名为 zero_list 的新列是一个 ArrayType(DecimalType()) 列,看起来像 [0.0, 0.0, 0.0, ...],其长度为 (df.x - df.y)
错误消息太笼统了,几乎不值得发布,只是“作业因阶段失败而中止”,它只能追溯到我执行df.show() 的代码部分,
Py4JJavaError Traceback (most recent call last)
<command-103561> in <module>()
---> 33 df.orderBy("z").show(n=1000)
/databricks/spark/python/pyspark/sql/dataframe.py in show(self, n, truncate, vertical)
350 """
351 if isinstance(truncate, bool) and truncate:
--> 352 print(self._jdf.showString(n, 20, vertical))
353 else:
354 print(self._jdf.showString(n, int(truncate), vertical))
/databricks/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py in __call__(self, *args)
1255 answer = self.gateway_client.send_command(command)
1256 return_value = get_return_value(
-> 1257 answer, self.gateway_client, self.target_id, self.name)
1258
1259 for temp_arg in temp_args:
我希望有人能指出我正确的方向来制作一个将返回可变长度数组的 pandas udf,或者只是告诉我为什么我的代码或方法是错误的。
我正在使用带有 spark 2.3.1 的数据块来完成所有这些工作。
【问题讨论】:
标签: python pandas pyspark pyspark-sql databricks