我有一个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")
1条答案
按热度按时间cetgtptt1#
在 这个 答案 中 , 你 有 一 个 如何 做 的 例子
中 的 每 一 个
在 您 的 情况 下 , 您
SET B...
:格式
不 正确 的 是
''
与null
不同 。 您 必须 在 条件 中 使用.isNull()
和.isNotNull()
。输入 示例 :
格式
脚本 :
格式