Hive 3.1.3映射多MySQL数据源关联查询失败求助
问题描述
通过JDBC Storage Handler在Hive中映射两个不同MySQL数据源的外部表,单表查询正常,但关联查询时出现错误:
Table not found in dpyy_ucs.order_info or Table not found in dpyy_vas.account_info
该场景在Hive 3.1.0中可正常运行,Hive 3.1.3下出现上述问题。
两张外部表的创建语句如下:
表1: dim_order_right_detail
CREATE EXTERNAL TABLE IF NOT EXISTS dim_order_right_detail( id bigint, right_detail_id string, open_id string, order_id string ) STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler' LOCATION 'hdfs://hdp5/dpyy/prod/hive/dpyy_prod.db/dim_order_right_detail' TBLPROPERTIES ( 'hive.sql.database.type' = 'MYSQL', 'hive.sql.jdbc.driver' = 'com.mysql.cj.jdbc.Driver', 'hive.sql.jdbc.url' = 'jdbc:mysql://XXX.XX.XXX.XXX:3306/dpyy_vas?&allowPublicKeyRetrieval=true&useSSL=false', 'hive.sql.dbcp.username' = 'XXXXX', 'hive.sql.dbcp.password' = 'XXXXX', 'hive.sql.query' = 'SELECT id,right_detail_id,open_id,order_id FROM order_right_detail', 'hive.sql.dbcp.maxActive' = '1' )
表2: dim_account_info
CREATE EXTERNAL TABLE IF NOT EXISTS dim_account_info( id bigint, open_id string, user_id string ) STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler' LOCATION 'hdfs://hdp5/dpyy/prod/hive/plat_prod.db/dim_account_info' TBLPROPERTIES ( 'hive.sql.database.type' = 'MYSQL', 'hive.sql.jdbc.driver' = 'com.mysql.cj.jdbc.Driver', 'hive.sql.jdbc.url' = 'jdbc:mysql://XXX.XXX.XXX.XXX:3306/dpyy_ucs?&allowPublicKeyRetrieval=true&useSSL=false', 'hive.sql.dbcp.username' = 'dpyy_bigdata', 'hive.sql.dbcp.password' = 'XXXXXXX', 'hive.sql.query' = 'SELECT id,open_id,user_id FROM account_info', 'hive.sql.dbcp.maxActive' = '1' )
解决建议
方案1:将数据预加载到Hive内部表后关联
先把两个外部表的数据同步到Hive本地内部表,再执行关联查询,绕过跨数据源关联的问题:-- 创建内部表并同步数据 CREATE TABLE dim_order_right_detail_local AS SELECT * FROM dim_order_right_detail; CREATE TABLE dim_account_info_local AS SELECT * FROM dim_account_info; -- 关联本地表 SELECT d.*, a.user_id FROM dim_order_right_detail_local d JOIN dim_account_info_local a ON d.open_id = a.open_id;方案2:关闭Hive谓词下推,强制本地关联
Hive 3.1.3的优化器可能错误地将关联逻辑下推到其中一个MySQL数据源执行,导致跨库表找不到。通过关闭谓词下推,让Hive先分别拉取两个表的数据,再在本地执行关联:-- 关闭谓词下推相关参数 SET hive.optimize.ppd=false; SET hive.optimize.index.filter=false; -- 执行关联查询 SELECT d.*, a.user_id FROM dim_order_right_detail d JOIN dim_account_info a ON d.open_id = a.open_id;方案3:检查Hive版本补丁或回退/升级版本
该问题仅在Hive 3.1.3出现,3.1.0正常,大概率是版本引入的JDBC Storage Handler bug。可以:- 查看Hive官方JIRA是否有相关已知issue及修复补丁
- 若业务允许,回退到Hive 3.1.0版本
- 升级到更高版本(如3.1.4及以上)验证问题是否解决
方案4:改用Sqoop批量导入数据
放弃直接通过JDBC Storage Handler映射外部表,改用Sqoop定期将MySQL数据导入Hive内部表,再进行关联分析,这是数仓离线场景的常规方案,稳定性更高:# 导入order_right_detail到Hive sqoop import \ --connect jdbc:mysql://XXX.XX.XXX.XXX:3306/dpyy_vas?allowPublicKeyRetrieval=true&useSSL=false \ --username XXXXX \ --password XXXXX \ --table order_right_detail \ --hive-import \ --hive-table dpyy_prod.dim_order_right_detail_local \ --create-hive-table # 导入account_info到Hive sqoop import \ --connect jdbc:mysql://XXX.XXX.XXX.XXX:3306/dpyy_ucs?allowPublicKeyRetrieval=true&useSSL=false \ --username dpyy_bigdata \ --password XXXXXXX \ --table account_info \ --hive-import \ --hive-table plat_prod.dim_account_info_local \ --create-hive-table
内容的提问来源于stack exchange,提问作者minyan-xiao
相关产品推荐
相关产品推荐

