【问题标题】:Invalid table alias or column reference 'SYNTHJOIN_xxxxx'无效的表别名或列引用“SYNTHJOIN_xxxxx”
【发布时间】:2019-07-12 11:00:59
【问题描述】:

希望能多看几眼; 我一生都无法弄清楚为什么这个查询不起作用,我正在将 Teradata SQL 脚本转换为 Hive。

        Select a.some_id FROM app_table_dc.seds_thingy_mapping_seds_vdata   e
         LEFT JOIN app_table_dc.assets a
            ON e.eng_serial_number = a.serial_number
            AND a.asset_type_id = 2
      LEFT JOIN (SELECT vdata_thingy_id
                                        , thingy_date InductDate
                                    FROM app_table_dc.seds_thingy_mapping_seds_vdata
                                    WHERE thingy_type = 'EI') ei

   ON ei.vdata_thingy_id = e.vdata_thingy_id
     JOIN app_table_dc.engine_type_asset_models am
        ON a.asset_model_id = am.asset_model_id
     JOIN app_table_dc.engine_type egt
        ON am.engine_type_id = egt.engine_type_id

最后两行不起作用;当我把它们拿出来时,它会运行......但是包含它们,我最终会显示错误日志:

错误代码:10004,SQL 状态:TStatus(statusCode:ERROR_STATUS, infoMessages:[*org.apache.hive.service.cli.HiveSQLException:错误 编译语句时:失败:SemanticException [错误 10004]: 第 1 行:4915 无效的表别名或列引用 'SYNTHJOIN_110d3abf':(可能的列名是:blahblahblah)

我确保所引用的表名具有正确的命名法/名称,以及所引用的列。我已经束手无策了。

感谢您提前提供任何见解!

【问题讨论】:

  • 据我了解,您的查询没有问题,需要更多详细信息 - 最后两行参考表 (app_table_dc.engine_type) ,您是否能够在没有任何错误的情况下查询此表并且是这是一个带/不带分区的外部/内部表
  • 您好,是的,我可以毫无问题地查询此表,它是一个非常小的关联实体表,只有 10 行左右。它不是事务性的,我相信它是一个内部表,应该是链接/连接表,没有分区。虽然第一个表上有 34 个唯一 ID,就像我说的那样,第二个表只有 10 个唯一 ID。虽然我非常怀疑这是问题所在。
  • 您能否检查一下engine_type_id 列是否存在于两个表中且类型相同?
  • 是的,engine_type_id 作为 BIGINT 存在于两个表中。很奇怪吧?

标签: hadoop hive subquery teradata alias


【解决方案1】:

--代码是对的

--因为我看到这个错误:(可能的列名是:blahblahblah)

您能否检查要加入的两个表((a,am),(am,egt)) 中是否存在asset_model_id 和engine_type_id。

可能是命名不同,因此引发错误。

【讨论】:

  • engine_type_id 存在于两个表中,asset_model_id 存在于 ((am,egt) ,(a,am))... 但是...我认为列名可能由于别名而发生变化前缀......也许这就是把它扔掉的原因?某种错位?虽然它没有解释前两个连接是如何工作的......我不知道
  • 从 app_table_dc.seds_thingy_mapping_seds_vdata 中选择 a.some_id e LEFT JOIN app_table_dc.assets a ON e.eng_serial_number = a.serial_number AND a.asset_type_id = 2 LEFT JOIN (SELECT vdata_thingy_id , thingy_date InductDate FROM app_table_dc.seds_thing thingy_type = 'EI' ) ei ON ei.vdata_thingy_id = e.vdata_thingy_id 加入 app_table_dc.engine_type_asset_models 开 a.asset_model_id = am.asset_model_id 加入 app_table_dc.engine_type egt ON am.engine_type_id = egt.engine_type_id
  • 感谢您的建议,返回相同的错误“无效的表别名或列引用'SYNTHJOIN_3812a350',可能的列名是:mapping_seq、vdata_thingy_id、seds_thingy_ref、thingy_type、eng_serial_number、thingy_date、new_vdata_thingy_id、etl_src_system I认为我将不得不以某种方式使用 CTE 或更小的表格来分解它...... :(
  • community.hortonworks.com/content/supportkb/150153/… ,设置 hive.server2.enable.doAs=true
【解决方案2】:

这是唯一有效的办法:

    with somealias as (select * from app_table_dc.engine_type)
                Select a.some_id 
            FROM app_table_dc.seds_thingy_mapping_seds_vdata e 
            LEFT JOIN app_table_dc.assets a ON e.eng_serial_number = a.serial_number AND a.asset_type_id = 2 
            LEFT JOIN (SELECT vdata_thingy_id , thingy_date InductDate FROM app_table_dc.seds_thingy_mapping_seds_vdata WHERE thingy_type = 'EI' ) ei 
            ON ei.vdata_thingy_id = e.vdata_thingy_id 
            JOIN app_table_dc.engine_type_asset_models am ON a.asset_model_id = am.asset_model_id 
    JOIN somealias egt 
ON am.engine_type_id = egt.engine_type_id 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 2023-03-30
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多