如何在重复键错误时左连接 Databricks

How to Left Join Databricks when duplicate keys error

我正在尝试执行 LEFT 联接,但出现此错误,因为联接键字段在结果数据中重复 table:

“SQL 语句中的错误:AnalysisException:在 schema 的 table 定义中找到重复的列。a_joinedorder_nbruser_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 是否有时间分量。