dataframe - Pyspark - 在右侧数据集中加入空值

标签 dataframe apache-spark pyspark apache-spark-sql

假设我有一个包含以下内容的数据集:

# dataset_left
 #+-----------------+--------------+---------------+
 #|         A       |       B      |      C        |
 #+-----------------+--------------+---------------+
 #|   some_value_1  | some_value_3 | some_value_5  |
 #+-----------------+--------------+---------------+
 #|   some_value_2  | some_value_4 | some_value_6  |
 #+-----------------+--------------+---------------+

我还有另一个数据集,如下所示:

# dataset_rules
 #+-----------------+--------------+---------------+
 #|         A       |       B      |  result_col   |
 #+-----------------+--------------+---------------+
 #|        null     | some_value_3 |    result_1   |
 #+-----------------+--------------+---------------+
 #|   some_value_2  |      null    |    result_2   |
 #+-----------------+--------------+---------------+

我的目标是使用此规则连接两个数据集:

对于 dataset_rules :A 列和 B 列中的空值可以匹配 dataset_left 中的任何值. 连接应该只考虑来自 dataset_rules 的非空值。

因此对于 dataset_rule 中的第一行,只有 B 列应该用作条件。对于第 2 行,只有列 A 应该用作条件。

我想达到以下预期结果:

# dataset_result
 #+-----------------+--------------+---------------+------------+
 #|         A       |       B      |      C        | result_col |
 #+-----------------+--------------+---------------+------------+
 #|   some_value_1  | some_value_3 | some_value_5  |   result_1 |
 #+-----------------+--------------+---------------+------------+
 #|   some_value_2  | some_value_4 | some_value_6  |   result_2 |
 #+-----------------+--------------+---------------+------------+

目标是避免在 dataset_rules 中对规则进行硬编码,以便于添加新规则并更易于维护。

最佳答案

您可以像这样使用 whencoalesce 表达式加入:

from pyspark.sql import functions as F

join_cond = (
        (F.coalesce(dataset_rules["A"], dataset_left["A"]) == dataset_left["A"])
        & (F.coalesce(dataset_rules["B"], dataset_left["B"]) == dataset_left["B"])
)

result = dataset_left.join(dataset_rules, join_cond, "left").select(
    dataset_left["*"],
    dataset_rules["result_col"]
)

result.show()
#+------------+------------+------------+----------+
#|           A|           B|           C|result_col|
#+------------+------------+------------+----------+
#|some_value_1|some_value_3|some_value_5|  result_1|
#|some_value_2|some_value_4|some_value_6|  result_2|
#+------------+------------+------------+----------+

关于dataframe - Pyspark - 在右侧数据集中加入空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70890880/

相关文章:

r - 将不同长度的向量绑定(bind)到数据帧

python - Pandas MultiIndex 级别的自定义分组

python - 如何将 JSON 文件读入 Dataframe?

apache-spark - Dataset.rdd 是 Action 还是转换?

scala - columnSimilarities() 返回 Spark 数据框

r - 列出 R 中数据帧中的所有不同字符串

hadoop - 如何使用Yarn在cloudera上添加Spark工作节点

apache-spark - 网.snowflake.client.jdbc.SnowflakeSQLException : SQL compilation error: Operation is not supported in reader account

python - 从 dataproc 中运行的 pyspark 作业将 python 数据对象保存到 Google 存储中的文件

python - 如何使用 pyspark 进行绘图?