配置单元更改Serde属性不起作用

Wil*_*m R 3 hadoop hive hdfs

我正在尝试通过使用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修复了该表。

查看数据的唯一方法是删除并重新创建外部表,任何人都可以帮助我了解原因。

表语法:

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/'
Run Code Online (Sandbox Code Playgroud)

Sam*_*ter 5

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在最终实现这些东西之前重命名一列确实很痛苦...