使用 Hive/Pyspark 的不明确列引用

Posted

技术标签:

【中文标题】使用 Hive/Pyspark 的不明确列引用【英文标题】:Ambiguous Column Reference with Hive/Pyspark 【发布时间】:2020-07-27 20:55:29 【问题描述】:

我需要执行以下查询:

SELECT 
    a.uuid,
    b.uuid
FROM
    (
        SELECT DISTINCT
            l.uuid AS east,
            r.uuid AS west
        FROM 
            tabl1            AS l
            INNER JOIN tabl1 AS r
                USING (attr_group)
            WHERE l.uuid < r.uuid
    )                           AS ids
    INNER JOIN tabl2            AS a 
        ON (ids.east = a.uuid)
    INNER JOIN tabl2            AS b
        ON (ids.west = b.uuid)

问题是,当我有两个 a.uuid 和 b.uuid 时,代码会在 uuuid 上给出模棱两可的错误。 但是当我尝试仅使用 a.uuid 或仅使用 b.uuid 时,查询有效。

另一个观察结果是查询使用 hive.execute(query) 运行,但不使用 hive.executeQuery(query)。我在 Zeppelin 中使用 pyspark 解释器。

HIVE 版本为:3.1.0。

【问题讨论】:

使用 AS 重命名一个 uuid,就像在 ids 子查询中一样。 @leftjoin 将 uuid 从“SELECT a.uuid, b.uuid ...”更改? 【参考方案1】:

最终结果集中的两列具有相同的名称。只需给它们起别名即可消除歧义:

SELECT 
    a.uuid AS uuid_a,  --> here
    b.uuid AS uuid_b   --> and here
FROM (
    SELECT DISTINCT
        l.uuid AS east,
        r.uuid AS west
    FROM tabl1 AS l
    INNER JOIN tabl1 AS r USING (attr_group)
    WHERE l.uuid < r.uuid
) AS ids
INNER JOIN tabl2 AS a ON ids.east = a.uuid
INNER JOIN tabl2 AS b ON ids.west = b.uuid

请注意,连接条件周围的括号是不必要的 - 我删除了它们。

【讨论】:

以上是关于使用 Hive/Pyspark 的不明确列引用的主要内容,如果未能解决你的问题,请参考以下文章

命名空间中的不明确引用

如何获取 HIVE/PySpark 表中每一列的唯一值?

DataFrame 连接中的不明确列 - 无法别名或调用

Oracle 12c - 插入到选择查询中的不明确列,ORA-00918

由于对成员 jsonObject 的不明确引用,我无法编译我的 alamofire 代码。为啥?

内联命名空间中对命名空间的不明确引用