Ошибка в литералах столбцов при использовании функции udf на фрейме данных с pyspark - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь использовать функцию udf на фрейме данных с pyspark, но получаю сообщение об ошибке в столбцах литералов и предлагает использовать функцию '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.

Не уверен, что это значит или как исправить. Я попытался обернуть освещенный вокруг каждого элемента столбца, но не ясно, что это должно делать, и это не работает для меня.

1 Ответ

0 голосов
/ 05 ноября 2018

любой аргумент в вашей UDF должен быть столбцом. В вашем случае [ ( 0, raw_dataset_df['Icorr_LBT01_R'] ), (1, raw_dataset_df['Icorr_LBT01_S']) ] - это не столбец, это список (объект python), и вы не можете использовать его в своем udf.

...