使用SQOOP从SQL Server导入数据到HIVE报10255表名无效及schema处理咨询
问题根因
报错直接触发点是Hive 表名仅支持两层命名空间格式(数据库名.表名),不识别你传入的三层结构AdventureWorks2019.Production.TransactionHistory,因此在语义分析阶段直接抛出10255无效表名异常。
两个容易踩的配置误区:
--hive-table参数传入的三层结构,本质是把SQL Server的「库名+Schema名+表名」直接拼接成了Hive端的表名,完全不符合Hive的命名校验规则。- 命令末尾追加的
-- --schema Production属于透传给底层JDBC连接的配置,不会作用到Hive端的表名生成逻辑,在Hive建表环节完全无效。
SQL Server Schema适配落地方案
针对带Schema的SQL Server表导入,不需要依赖网上通用教程的无Schema库场景配置,直接按以下规则调整即可:
- 映射规则对齐:Hive本身没有Schema概念,可将SQL Server的库名对应到Hive的数据库名,SQL Server的Schema名通过两种方式适配:
- 方式1:在Hive中单独创建对应Schema名的数据库,比如将SQL Server的
ProductionSchema映射为Hive的production库,表名保持和SQL Server一致即可。 - 方式2:如果不想拆分过多Hive库,直接把Schema名作为Hive表名的前缀(用下划线分隔,不要加
.),避免触发三层命名的校验错误。
- 方式1:在Hive中单独创建对应Schema名的数据库,比如将SQL Server的
- SQL Server端Schema读取配置:不需要额外透传
--schema参数,直接在--table参数中写全限定表名生产schema.表名,Sqoop会通过JDBC元数据自动读取对应Schema下的表结构和数据,和无Schema表的导入逻辑完全一致。 - 移除冗余的路径配置:原命令中手动指定的
--warehouse-dir "/user/hive/warehouse/AdventureWorks2019.db"会和Hive的默认库路径产生冲突,替换为--hive-database显式指定Hive库,让Sqoop自动匹配对应库的存储路径即可。
修正后可直接运行的命令
sudo -u hdfs sqoop import \ -Dorg.apache.sqoop.splitter.allow_text_splitter=true \ --connect "jdbc:sqlserver://XX.XX.X.X:1433;instanceName=data-engr-sql-svr;databaseName=AdventureWorks2019" \ --username sa \ --password XXXXXXXX \ --driver com.microsoft.sqlserver.jdbc.SQLServerDriver \ --hive-import \ --create-hive-table \ --fields-terminated-by ',' \ --hive-database AdventureWorks2019 \ --hive-table Production_TransactionHistory \ --table Production.TransactionHistory \ --split-by TransactionID
注意事项:如果之前已经手动把数据导入到了
/user/hive/warehouse/AdventureWorks2019.db路径下,可以在上述命令中追加--hive-overwrite、--delete-target-dir参数,避免重复导入产生数据冲突。不要在--hive-table参数中用.做层级分隔,一旦出现两个以上的.,就会直接触发Hive的表名校验失败。
内容的提问来源于stack exchange,提问作者jarvis
相关产品推荐
相关产品推荐

