dataframe - 关于在带有 pyspark 的数据帧上使用 udf 函数的列文字错误
问题描述
我正在尝试在带有 pyspark 的数据帧上使用 udf 函数,但收到有关列文字的错误,并建议我使用“lit”、“array”、“struct”或“create_map”函数。我不清楚如何做到这一点。
from pyspark.sql.types import IntegerType
from pyspark.sql.functions import udf
def compareElem(elem):
return elem[1]
def getSmallest(type, final_list):
final_list.sort(key=compareElem)
print(final_list)
l = final_list[0][0]
print('idx=', l)
if type == 1:
l = (((l/4)+1)*4)-1
return l
功能在列表输入上正常工作
getSmallest(0, [ ( 0, 1), (1, 1.1), (2, 0.5) ])
返回
[(2, 0.5), (0, 1), (1, 1.1)]
('idx=', 2)
但在这里与 udf 和 dataframe 列一起使用失败
func_udf = udf(getSmallest, IntegerType())
raw_dataset_df = raw_dataset_df.withColumn('result',func_udf(
raw_dataset_df['type'], [ ( 0, raw_dataset_df['Icorr_LBT01_R'] ), (1, raw_dataset_df['Icorr_LBT01_S']) ] ));
我收到以下错误
TypeError: Invalid argument, not a string or column: [(0, Column<Icorr_LBT01_R>), (1, Column<Icorr_LBT01_S>)] of type <type 'list'>. For column literals, use 'lit', 'array', 'struct' or 'create_map' function.
不确定这意味着什么或如何解决。我尝试将 lit 包裹在每个 Column 元素周围,但不清楚这应该做什么,它对我不起作用。
解决方案
UDF 中的任何参数都应该是一列。在您的情况下[ ( 0, raw_dataset_df['Icorr_LBT01_R'] ), (1, raw_dataset_df['Icorr_LBT01_S']) ]
,它不是列,而是列表(python 对象),您不能在 udf 中使用它。
推荐阅读
- javascript - NPM:当依赖于 jshint 时如何更新 lodash
- wordpress - 如何更改 wordpress.org 上的插件标签?
- cloud - TPM 如何为云提供安全性?
- speech-recognition - 有没有办法在 grxml 中进行条件逻辑?
- c# - C# LIifxNet 切换光功率,LIFX
- excel - Excel:从两列中提取按字母顺序排列的元素的唯一不同列表
- python - Python - 包安装
- javascript - 为什么此代码会提示“未定义”
- java - 从 TableView 和 UpdateItem 覆盖方法中获取行
- javascript - 如何仅在项目加载时显示模式弹出窗口一次,而不是在页面上以 2/4 角度刷新