如何在重复键错误时左连接 Databricks
How to Left Join Databricks when duplicate keys error
我正在尝试执行 LEFT 联接,但出现此错误,因为联接键字段在结果数据中重复 table:
“SQL 语句中的错误:AnalysisException:在 schema
的 table 定义中找到重复的列。a_joined
:order_nbr
, user_id
;"
DROP TABLE IF EXISTS schema.a_joined;
CREATE TABLE schema.a_joined STORED AS parquet
LOCATION 's3://user-data/gck/user/schema.a_joined' AS
SELECT
schema.a.*,
schema.b.*
FROM
schema.a
LEFT JOIN
schema.b ON
schema.b.ORDER_NBR = schema.a.order_nbr AND
schema.b.ORDER_DT = schema.a.trans_dt
WHERE
trans_dt BETWEEN '2020-01-01' AND '2020-12-31'
SQL 标准支持 JOIN
的一种形式,它使用 USING
而不是 ON
。这允许 SELECT *
无需获取重复的列。唉,Hive 不支持那个。
可能最简单的做法是 select 一个 table 中的所有列,然后列出第二个 table 中的列:
SELECT a.*, b.col1, b.col2, . . .
FROM
schema.a a LEFT JOIN
schema.b b
ON b.ORDER_NBR = a.order_nbr AND
b.ORDER_DT = a.trans_dt
WHERE a.trans_dt BETWEEN '2020-01-01' AND '2020-12-31';
注意 table 别名和限定列引用的使用。这些简化了查询,因此更容易编写和阅读。我假设 trans_dt
来自 a
——否则 LEFT JOIN
会变成 INNER JOIN
。
注意:我建议将 WHERE
条件写为:
WHERE a.trans_dt >= '2020-01-01' AND
a.trans_dt < '2021-01-01;
为什么?这适用于日期和 date/times。这 returns 所有 trans_dt
都在 2020 年的行,无论 trans_dt
是否有时间分量。
我正在尝试执行 LEFT 联接,但出现此错误,因为联接键字段在结果数据中重复 table:
“SQL 语句中的错误:AnalysisException:在 schema
的 table 定义中找到重复的列。a_joined
:order_nbr
, user_id
;"
DROP TABLE IF EXISTS schema.a_joined;
CREATE TABLE schema.a_joined STORED AS parquet
LOCATION 's3://user-data/gck/user/schema.a_joined' AS
SELECT
schema.a.*,
schema.b.*
FROM
schema.a
LEFT JOIN
schema.b ON
schema.b.ORDER_NBR = schema.a.order_nbr AND
schema.b.ORDER_DT = schema.a.trans_dt
WHERE
trans_dt BETWEEN '2020-01-01' AND '2020-12-31'
SQL 标准支持 JOIN
的一种形式,它使用 USING
而不是 ON
。这允许 SELECT *
无需获取重复的列。唉,Hive 不支持那个。
可能最简单的做法是 select 一个 table 中的所有列,然后列出第二个 table 中的列:
SELECT a.*, b.col1, b.col2, . . .
FROM
schema.a a LEFT JOIN
schema.b b
ON b.ORDER_NBR = a.order_nbr AND
b.ORDER_DT = a.trans_dt
WHERE a.trans_dt BETWEEN '2020-01-01' AND '2020-12-31';
注意 table 别名和限定列引用的使用。这些简化了查询,因此更容易编写和阅读。我假设 trans_dt
来自 a
——否则 LEFT JOIN
会变成 INNER JOIN
。
注意:我建议将 WHERE
条件写为:
WHERE a.trans_dt >= '2020-01-01' AND
a.trans_dt < '2021-01-01;
为什么?这适用于日期和 date/times。这 returns 所有 trans_dt
都在 2020 年的行,无论 trans_dt
是否有时间分量。