我正在使用 PySpark 2.4。
我有一個如下所示的資料框作為輸入:
ceci_p| ceci_l|ceci_stok|
------- ------- ---------
SFIL401| BPI202| BPI202|
BPI202| CDC111| BPI202|
LBP347|SFIL402| SFIL402|
LBP347|SFIL402| LBP347|
------- ------- ---------
我想檢測使用連接(可能是自連接)在兩個和列ceci_stok中都存在哪些值。ceci_lceci_p
例如:ceci_stok = BPI202同時存在于ceci_l和ceci_p中。
我想創建一個新的資料框,結果包含和ceci_stok中都存在的資料框。ceci_lceci_p
uj5u.com熱心網友回復:
以下似乎在 Spark 3.0.2 中有效。請嘗試一下。
from pyspark.sql functions as F
df2 = (
df.select('ceci_stok').alias('_stok')
.join(df.alias('_p'), F.col('_stok.ceci_stok') == F.col('_p.ceci_p'), 'leftsemi')
.join(df.alias('_l'), F.col('_stok.ceci_stok') == F.col('_l.ceci_l'), 'leftsemi')
.distinct()
)
df2.show()
# ---------
# |ceci_stok|
# ---------
# | BPI202|
# ---------
uj5u.com熱心網友回復:
#c reate data for testing
data = [("SFIL401","BPI202","BPI202"),
("BPI202","CDC111","BPI202"),
("LBP347","SFIL402","SFIL402"),
("LBP347","SFIL402","LBP347")]
data_schema = ["ceci_p","ceci_l","ceci_stok"]
df = spark.createDataFrame(data=data, schema = data_schema)
ceci_p = df.cache()\ #don't forget to cache table you reference multiple times.
.select( df.ceci_p.alias("join_key") )\ #rename for union
.distinct()
ceci_l = df\
.select( df.ceci_l.alias("join_key") )\ #rename for union
.distinct()
vals = ceci_l.join(ceci_p,"join_key").distinct() # get unique values to both columns your interested in
df.join( vals, df.ceci_stok == vals.join_key ).show()
------- ------- --------- --------
| ceci_p| ceci_l|ceci_stok|join_key|
------- ------- --------- --------
|SFIL401| BPI202| BPI202| BPI202|
| BPI202| CDC111| BPI202| BPI202|
------- ------- --------- --------
uj5u.com熱心網友回復:
你是對的,這可以使用自動加入來完成。如果你有一個資料框
>>> df.show(truncate=False)
------- ------- ---------
|ceci_p |ceci_l |ceci_stok|
------- ------- ---------
|SFIL401|BPI202 |BPI202 |
|BPI202 |CDC111 |BPI202 |
|LBP347 |SFIL402|SFIL402 |
|LBP347 |SFIL402|LBP347 |
------- ------- ---------
...然后以下幾個連接(“leftsemi”放在右側)應該產生你需要的東西:
>>> df.select("ceci_stok") \
.join(df.select("ceci_p"),df.ceci_stok == df.ceci_p,"leftsemi") \
.join(df.select("ceci_l"),df.ceci_stok == df.ceci_l,"leftsemi") \
.show(truncate=False)
---------
|ceci_stok|
---------
|BPI202 |
|BPI202 |
---------
如果您只對唯一值感興趣,則可以對結果進行重復資料洗掉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/486897.html
標籤:阿帕奇火花 pyspark apache-spark-sql 自加入
上一篇:無法選擇幾列
