簡體   English   中英

如何將第二個數據幀的列傳遞到PySpark 1.6.1中的UDF

[英]How to pass the column of a second dataframe into a UDF in PySpark 1.6.1

這就是我想要做的。 我想在兩個不同的數據幀中對兩列的每個條目進行比較。 數據框如下所示:

>>> 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是一個比較當時兩個元素的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM