【发布时间】:2019-12-20 04:17:17
【问题描述】:
我有一个用户定义函数的问题,该函数是为连接一个数据帧中的值而构建的,该数据帧与另一个数据帧中的索引值匹配。
以下是我尝试匹配的简化数据框:
a_df:
+-------+------+
| index | name |
+-------+------+
| 1 | aaa |
| 2 | bbb |
| 3 | ccc |
| 4 | ddd |
| 5 | eee |
+-------+------+
b_df:
+-------+------+
| index | code |
+-------+------+
| 1 | 101 |
| 2 | 102 |
| 3 | 101 |
| 3 | 102 |
| 4 | 103 |
| 4 | 104 |
| 5 | 101 |
+-------+------+
udf 函数和调用:
> def concatcodes(index, dataframe):
> res = dataframe.where(dataframe.index == index).collect()
> reslist = "|".join([value.code for value in res])
> return reslist
>
> spark.udf.register("concatcodes", concatcodes, StringType())
>
> resultDF = a_DF.withColumn("codes", lit(concatcodes(a_DF.index, b_df)))
我希望每个 a_DF 数据帧的每一行都调用该函数,从而产生以下输出:
+-------+------+-------+
| index | name |codes |
+-------+------+-------+
| 1 | aaa |101 |
| 2 | bbb |102 |
| 3 | ccc |101|102|
| 4 | ddd |103|104|
| 5 | eee |101 |
+-------+------+-------+
但是,该函数似乎只被调用一次,整个列作为其参数传递,导致以下输出:
+-------+------+---------------------------+
| index | name |codes |
+-------+------+---------------------------+
| 1 | aaa |101|102|101|102|103|104|101| |
| 2 | bbb |101|102|101|102|103|104|101|
| 3 | ccc |101|102|101|102|103|104|101|
| 4 | ddd |101|102|101|102|103|104|101|
| 5 | eee |101|102|101|102|103|104|101|
+-------+------+---------------------------+
我想在 .withColum 方法中调用 UDF 时我做错了什么,但我不知道是什么 - 我非常感谢有人指出我的逻辑有什么问题。
【问题讨论】:
标签: python apache-spark pyspark user-defined-functions databricks