Hive修改Parquet类型表字段几种问题处理

本文介绍了在Hive中使用Parquet格式存储数据时遇到的字段名和类型修改问题。当尝试修改Parquet表的字段名或类型时,可能会导致查询结果出现null值或遇到UnsupportedOperationException。解决这些问题的方法包括设置'hive.parquet.column.index.access'参数为'true'来按序号读取字段,以及在修改类型后重新处理历史数据。若要避免问题,建议在有频繁变动需求时使用text格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hive中的表数据存储类型可以使用parquet,优势在于列式存储方便压缩,加快查询速度,在实际生产环境中,往往不会有字段命名或类型修改的数仓宽表才会使用
临时或短期需求使用parquet的缺点在于字段类型修改等重刷数据及查询有问题,往往直接使用text格式方便修改。

本文梳理了Hive修改Parquet类型表字段几种问题及其处理方案

建表:

CREATE TABLE `app_test_20221019`(
  `group_id` string COMMENT '维度组合id', 
  `dimension` string COMMENT '维度组合类型',
  `uv` bigint COMMENT 'uv')
COMMENT 'parquet测试'
PARTITIONED BY ( 
  `dt` string COMMENT '日期分区')
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
;

当使用parquest格式建表,修改字段名时:

alter table app_test_20221019 change column group_id id string;

修改完成后查询结果只会为null,原因是hive默认的读取parquet文件是按照名称读取的(默认是按序列号读取的)

这个参数的功能是使hive读取parquet文件时使用序列号读取,设置后可以解决null值问题

ALTER TABLE app_test_20221019 SET TBLPROPERTIES ('parquet.column.index.access'='true');

当使用parquest格式,修改字段类型时:

alter table app_test_20221019 change column group_id group_id bigint;

如果只查询历史数据,不重写数据没有问题,但如果重写历史数据后查询报以下错误

Failed with exception java.io.IOException:java.lang.UnsupportedOperationException: Cannot inspect org.apache.hadoop.io.IntWritable

解决方案:
方案1.删除历史数据并重写,注意先删除路径下的文件,不可以直接overwrite;
方案2.将字段类型改回原类型;

延伸:如果在新的分区中写入新的数据也是可以的,即parquest修改字段类型后如果涉及到重写数据一定要先删除文件再写入。

参考:
1.https://blog.youkuaiyun.com/skyupward/article/details/107999323
2.https://blog.youkuaiyun.com/Fread325/article/details/126290070

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值