我有低于 pyspark 数据帧 df,我想检查 id 是否存在于另一个数据帧 df1 中,并为每一行返回 true 和 false。
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
import pyspark.sql.functions as F
# Create SparkSession
data=[["12345","2020-02-01"],["6789","2019-03-01"],["12345","2021-03-01"],["7890",""],["5000","2021-21-01"],["80000","1900-01-01"],["90000","2000-01-01"],["","2000-01-01"]]
df=spark.createDataFrame(data,["id","Date"])
df.show()
data=[["12345"],["6789"],["7890"],["90000"]]
df1=spark.createDataFrame(data,["id"])
df1.show()
df 数据框:
id | 日期 |
---|---|
12345 | 2020-02-01 |
6789 | 2019-03-01 |
12345 | 2021-03-01 |
7890 | |
5000 | 2021-21-01 |
80000 | 1900-01-01 |
90000 | 2000-01-01 |
2000-01-01 |
df1 数据框:
id |
---|
12345 |
6789 |
7890 |
90000 |
我希望根据 df 与 df1 的比较得到低于输出。
id | 检查 |
---|---|
12345 | 真 |
6789 | 真 |
12345 | 真 |
7890 | 真 |
5000 | 假 |
80000 | 假 |
90000 | 真 |
假 |
答案 0 :(得分:2)
正如评论中提到的,使用左连接。首先我们需要添加一个
df1
的附加列,可帮助我们识别 df1
中的 ID。
然后我们合并列以获得 True
和 False
值:
from pyspark.sql import functions as f
df.join(df1.withColumn('Check', f.lit(True)), on="id", how='left')\
.withColumn("Check", f.coalesce("Check", f.lit(False))).show()
结果:
+-----+----------+-----+
| id| Date|Check|
+-----+----------+-----+
| 5000|2021-21-01|false|
|90000|2000-01-01| true|
| 6789|2019-03-01| true|
| 7890| | true|
|80000|1900-01-01|false|
|12345|2020-02-01| true|
|12345|2021-03-01| true|
| |2000-01-01|false|
+-----+----------+-----+
诀窍是在连接之前将检查列添加到 df1
。正在执行
df.join(df1.withColumn('Check', f.lit(True)), on="id", how='left')
结果:
+-----+----------+-----+
| id| Date|Check|
+-----+----------+-----+
| 5000|2021-21-01| null|
|90000|2000-01-01| true|
| 6789|2019-03-01| true|
| 7890| | true|
|80000|1900-01-01| null|
|12345|2020-02-01| true|
|12345|2021-03-01| true|
| |2000-01-01| null|
+-----+----------+-----+
现在我们需要合并 Check
列以得到所需的 True/False
值。