CDH环境下如何将HDFS中已有的Delta表注册到Hive
Delta表注册到Hive操作指南(适配CDH 6.3.3 + Spark 2.4.0 + Delta 0.5.0)
以下两种方案均兼容你当前使用的组件版本,优先推荐第一种Spark侧注册方案,兼容性和易用性更高。
方案1:通过Spark SQL注册(优先推荐)
该方案依托Delta和Spark的原生集成能力,自动读取Delta表的schema和事务信息,无需手动填写表结构。
- 启动spark-sql前先确认依赖适配:CDH 6.3.3默认Scala版本为2.11,需使用对应版本的Delta依赖包,坐标为
io.delta:delta-core_2.11:0.5.0 - 启动spark-sql的参考命令:
spark-sql \ --packages io.delta:delta-core_2.11:0.5.0 \ --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension \ --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog \ --master yarn \ --deploy-mode client
- 进入spark-sql交互窗口后执行注册语句,必须指定为外部表避免误删HDFS数据:
CREATE EXTERNAL TABLE 你的Hive库名.目标表名 USING DELTA LOCATION 'hdfs://你的NameNode服务地址/Delta数据存放在HDFS的完整路径';
- 验证:注册完成后直接在Hive CLI或beeline中执行
SELECT * FROM 库名.表名 LIMIT 10即可正常查询数据。
注意:该方式注册的表Hive侧仅支持读操作,所有写入、更新、合并操作必须走Spark Delta API执行,避免破坏Delta事务日志。
方案2:Hive侧手动创建外部表
如果无法通过Spark操作,也可以直接在Hive端建表,需提前明确Delta表的完整schema。
- 第一步:将
delta-core_2.11-0.5.0.jar上传到所有Hive执行节点可访问的公共HDFS路径,例如hdfs:///common/jars/delta-core_2.11-0.5.0.jar - 第二步:进入beeline或Hive CLI执行建表语句,字段结构必须和Delta表完全一致:
CREATE EXTERNAL TABLE 你的Hive库名.目标表名 ( -- 此处替换为Delta表实际的字段名和类型 id INT, name STRING, create_time TIMESTAMP ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.spark.sql.delta.hive.DeltaInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 'hdfs://你的NameNode服务地址/Delta数据存放在HDFS的完整路径' TBLPROPERTIES ( 'delta.storage.version' = '0.5.0', 'serialization.lib' = 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' );
- 如果启动Hive会话时提示类不存在,可在启动命令中添加jar包加载参数:
beeline --hiveconf hive.aux.jars.path=hdfs:///common/jars/delta-core_2.11-0.5.0.jar,也可直接将参数配置到hive-site.xml中全局生效。
常见问题排查
- 查询数据重复:Delta表有过更新/删除操作时,不能直接读取路径下的Parquet文件,必须通过注册的Hive表查询,DeltaInputFormat会自动过滤过期数据文件
- 权限报错:检查Hive服务的执行用户对Delta表的HDFS路径和_delta_log目录有可读权限
- 版本不兼容:不要使用高于0.5.0版本的Delta包,和Spark 2.4.0会出现接口不兼容问题
内容的提问来源于stack exchange,提问作者Gilbl
相关产品推荐
相关产品推荐

