我正在尝试在带有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.
不确定这是什么意思或如何解决。我尝试在每个Column元素周围包裹光,但是不清楚应该怎么做,并且对我不起作用。
答案 0 :(得分:0)
UDF中的任何参数都应为一列。
如果您的情况[ ( 0, raw_dataset_df['Icorr_LBT01_R'] ), (1, raw_dataset_df['Icorr_LBT01_S']) ]
不是列,而是列表(python对象),则不能在udf中使用它。