关于在带有pyspark的数据帧上使用udf函数的列文字的错误

时间:2018-11-05 10:51:03

标签: dataframe pyspark user-defined-functions

我正在尝试在带有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元素周围包裹光,但是不清楚应该怎么做,并且对我不起作用。

1 个答案:

答案 0 :(得分:0)

UDF中的任何参数都应为一列。 如果您的情况[ ( 0, raw_dataset_df['Icorr_LBT01_R'] ), (1, raw_dataset_df['Icorr_LBT01_S']) ]不是列,而是列表(python对象),则不能在udf中使用它。