如何从存储为parquet的hive分区表中删除字段?

kmpatx3s  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(939)

我正在寻找一种方法来修改配置单元中的Parquet数据表,以删除一些字段。表是托管的,但这并不重要,因为我可以将它转换为外部的。
问题是我不能使用这个命令 ALTER TABLE ... REPLACE COLUMN 用Parquet地板隔开的table。
它适用于文本文件格式(分区或不分区),仅适用于非分区Parquet表。
我试图替换列,但结果是:

hive> ALTER TABLE db_test.mytable REPLACE COLUMNS(name String);
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.
Replacing columns cannot drop columns for table db_test.mytable. 
SerDe may be incompatible

我考虑过一些解决方案,但都不符合我的设想:
第一
-[可选]在外部转换表。
-删除表。
-用我想要的字段重新创建表。
-msck修复表添加hdfs分区。
-[可选]转换回托管表。
第二
-用我选择的字段创建临时表作为原始表的选择。
-删除原始表。
-将临时表重命名为原始名称。
这两个选项都会影响我的进程,因为我将丢失表的统计信息。这张表被 Impala 的微观策略所消耗,我需要保存统计数据。
另外,第二种解决方案对于非常大的数据表是不好的。
   
有什么建议吗?
提前谢谢。

2wnc66cl

2wnc66cl1#

您可以使用第一个方法,然后运行

hive> anayze table <db_name>.<table_name> compute statistics;

计算表中的所有统计信息。

相关问题