我想将合并功能应用于DataFrame的一列中的数据,并将结果存储在添加到DataFrame的新列中。
理想情况下,我想确保可以在递归中使用任何自定义python函数,因为列中的行可以是数组,并且我想对每个数组中的每个元素进行装箱。除了最终对数据进行装箱之外,我还想执行其他操作。
我知道我可以使用withColumn(...)
添加一个新列,但是我不知道如何正确放置为该新列生成数据的函数。
编辑: similar question解决了部分问题-创建用户定义的函数。 但是,它似乎不接受列表作为参数:
def put_number_in_bin(number, bins):
if is_number(number):
number = float(number)
for i, b in enumerate(bins):
if number <= b:
bin_selected = str(i)
break
return bin_selected
else:
return str("NULL")
binning_udf = udf(lambda (x, bins): put_number_in_bin(x, bins), StringType())
bins = [0.0, 182.0, 309.4000000000001, 540.0, 846.0, 2714.0, 5872.561999999998, 10655.993999999999, 20183.062, 46350.379999999976, 4852207.7]
df_augment = df_all.withColumn("newCol1", binning_udf(df_all.total_cost, bins))
结果是此错误:
TypeError: Invalid argument, not a string or column: [0.0, 182.0, 309.4000000000001, 540.0, 846.0, 2714.0, 5872.561999999998, 10655.993999999999, 20183.062, 46350.379999999976, 4852207.7] of type <type 'list'>. For column literals, use 'lit', 'array', 'struct' or 'create_map' function.