gpt4 book ai didi

python - 如何在 PySpark 1.6.1 中将第二个数据帧的列传递到 UDF 中

转载 作者:行者123 更新时间:2023-11-30 22:39:20 24 4
gpt4 key购买 nike

这就是我正在尝试做的事情。我想对两个不同数据帧中两列的每个条目进行比较。数据框如下所示:

>>> subject_df.show()
+------+-------------+
|USERID| FULLNAME|
+------+-------------+
| 12345| steve james|
| 12346| steven smith|
| 43212|bill dunnigan|
+------+-------------+

>>> target_df.show()
+------+-------------+
|USERID| FULLNAME|
+------+-------------+
|111123| steve tyler|
|422226| linda smith|
|123333|bill dunnigan|
| 56453| steve smith|
+------+-------------+

这是我尝试使用的逻辑:

# CREATE FUNCTION    
def string_match(subject, targets):
for target in targets:
<logic>
return logic_result

# CREATE UDF
string_match_udf = udf(string_match, IntegerType())

# APPLY UDF
subject_df.select(subject_df.FULLNAME, string_match_udf(subject_df.FULLNAME, target_df.FULLNAME).alias("score"))

这是我在 pyspark shell 中运行代码时遇到的错误:

py4j.protocol.Py4JJavaError: An error occurred while calling o45.select.
: java.lang.RuntimeException: Invalid PythonUDF PythonUDF#string_match(FULLNAME#2,FULLNAME#5), requires attributes from more than one child.

我认为问题的根源是试图将第二列传递给函数。我应该使用 RDD 吗?请记住,实际的 subject_df 和 target_df 都超过 100,000 行。我愿意接受任何建议。

最佳答案

看来您对用户定义函数的工作原理有错误的想法:

  • 函数一次仅从一行接收值
  • 您不能使用不相关的 DataFame 中的数据。

做你想做的事的唯一方法是采用笛卡尔积。

subject_df.join(target_df).select(
f(subject_df.FULLNAME, target_df.FULLNAME)
)

其中f是一个同时比较两个元素的函数。

关于python - 如何在 PySpark 1.6.1 中将第二个数据帧的列传递到 UDF 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43195168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com