我正在尝试通过使用Hive ALTER TABLE语句将现有的Hive外部表定界符从逗号,更改为ctrl+A字符
ALTER TABLE table_name SET SERDEPROPERTIES ('field.delim' = '\u0001');
Run Code Online (Sandbox Code Playgroud)
在DDL之后,我可以看到更改
show create table table_name
Run Code Online (Sandbox Code Playgroud)
但是,当我从Hive中选择时,这些值都是NULL(HDFS中的基础文件已更改为具有ctrl + A分隔符)。
我还通过使用msck修复了该表。
查看数据的唯一方法是删除并重新创建外部表,任何人都可以帮助我了解原因。
表语法:
Run Code Online (Sandbox Code Playgroud)CREATE EXTERNAL TABLE `table_name`( col1, col2, col3) PARTITIONED BY ( `ing_year` int, `ing_month` int, `ing_day` int) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'hdfs://location/'
ALTER TABLE分区表上的命令更改了将来分区的默认设置。
但它并不适用于现有的分区,除非特定命令支持的CASCADE选项-而这是不是这样的SET SERDEPROPERTIES; 与列管理进行比较
因此,您必须使用这种命令更改每个现有分区
ALTER TABLE table_name PARTITION (ing_year=2016,ing_month=8,ing_day=31)
SET SERDEPROPERTIES ('field.delim' = '\u0001');
Run Code Online (Sandbox Code Playgroud)
因此,现在是时候运行a SHOW PARTITIONS,在输出上应用几个RegEx来生成命令列表,运行这些命令并从此变得快乐起来了。
旁注:我可以告诉您,CASCADE在最终实现这些东西之前重命名一列确实很痛苦...