在PySpark中使用JOIN和多个WHERE条件更新列值

ioekq8ef  于 2022-11-21  发布在  Spark
关注(0)|答案(1)|浏览(187)

我有一个SQL查询,我试图将其转换为PySpark,其中包含一些join和多个where条件:

UPDATE COMPANY1
INNER JOIN COMPANY2
ON COMPANY1.C1_PROFIT = COMPANY2.C2_PROFIT 
SET COMPANY2.C2_TARGET = "1"
WHERE (((COMPANY2.C2_TARGET) Is Null)
  AND ((COMPANY1.C1_SALES) Is Null)
  AND ((COMPANY2.C2_PROFIT) Is Not Null));

我正在尝试执行的PySpark查询(df_1-〉COMPANY2 & df_2-〉Company1):

join = ((df_1.C2_PROFIT == df_2.C1_PROFIT) & \
  (df_1.C2_TARGET=='') & \
  (df_2.C1_SALES=='') & \
  (df_1.C2_PROFIT!=''))
df_1 = (df_1.alias('a')
  .join(df_2.alias('b'), join, 'left')
  .select(
    *[c for c in df_1.columns if c != 'C2_TARGET'],
    F.expr("nvl2(b.C1_PROFIT, '1', a.C2_TARGET) C2_TARGET")
  )
)

但是我仍然在列“C2_TARGET”中得到null值。
有关信息:列“C1_Profit”是无空值的,但在“C2_Profit”中,我们有时会有null以及值。
输入示例:

+------------------+--------------+
|  C1_PROFIT       |C1_SALES      |
+------------------+--------------+
|5637              |     Positive |
|7464              |              |
|43645             |              |
|64657             |      Growth P|
+------------------+--------------+

+------------------+--------------+
|  C2_PROFIT       |C2_TARGET     |
+------------------+--------------+
|                  |              |
|7464              |              |
|43645             |              |
|64657             |              |
+------------------+--------------+

预期结果:

join_on = (df_1.C1_PROFIT == df_2.C2_PROFIT) & \   --JOIN CONDITION
            (df_1.C1_REVENUE == df_3.C3_REVENUE_BREAK) & \  --JOIN CONDITION
            (df_1.C1_LOSS == df_4.C4_TOTAL_LOSS) & \        --JOIN CONDITION
            ((df_4.MARGIN_OF_COMPANY) > (df_3.LAST_YEAR_MARGIN))   --WHERE CONDITION
df = (df_1.alias('a')
    .join(df_2.alias('b'), join_on, 'left')
    .join(df_3.alias('c'), join_on, 'left')
    .join(df_4.alias('c'), join_on. 'left')
    .select(
    *[c for c in df_2.columns if c != 'C2_TARGET'],
    F.expr("nvl2(b.C2_PROFIT, '1', a.C2_TARGET) C2_TARGET")
cetgtptt

cetgtptt1#

在 这个 答案 中 , 你 有 一 个 如何 做 的 例子

UPDATE A INNER JOIN B
...
SET A...

中 的 每 一 个
在 您 的 情况 下 , 您 SET B...

UPDATE A INNER JOIN B
...
SET B...

格式

  • 您 已 正确 切换 数据 帧 的 顺序 。 *

不 正确 的 是 ''null 不同 。 您 必须 在 条件 中 使用 .isNull().isNotNull()
输入 示例 :

from pyspark.sql import functions as F
df_1 = spark.createDataFrame(
    [(5637, 'Positive'),
     (7464, None),
     (43645, None),
     (64657, 'Growth P')],
    ['C1_PROFIT', 'C1_SALES'])

df_2 = spark.createDataFrame(
    [(None, None),
     (7464, None),
     (43645, None),
     (64657, None)],
    'C2_PROFIT int, C2_TARGET string')

格式
脚本 :

join_on = (df_1.C1_PROFIT == df_2.C2_PROFIT) & \
          df_2.C2_TARGET.isNull() & \
          df_1.C1_SALES.isNull() & \
          df_2.C2_PROFIT.isNotNull()
df = (df_2.alias('a')
    .join(df_1.alias('b'), join_on, 'left')
    .select(
        *[c for c in df_2.columns if c != 'C2_TARGET'],
        F.expr("nvl2(b.C1_PROFIT, '1', a.C2_TARGET) C2_TARGET")
    )
)

df.show()
# +---------+---------+
# |C2_PROFIT|C2_TARGET|
# +---------+---------+
# |     null|     null|
# |     7464|        1|
# |    64657|     null|
# |    43645|        1|
# +---------+---------+

格式

相关问题