Hive改变serde属性不起作用

时间:2016-08-09 13:41:17

标签: hadoop hive hdfs

我尝试使用Hive ALTER TABLE语句将现有的Hive外部表分隔符从逗号,更改为ctrl+A字符

ALTER TABLE table_name SET SERDEPROPERTIES ('field.delim' = '\u0001');

在DDL之后我可以看到变化

show create table table_name

但是当我从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/'

3 个答案:

答案 0 :(得分:3)

分区表上的ALTER TABLE命令会更改 future 分区的默认设置。

但是它不会应用于现有分区,除非该特定命令支持CASCADE选项 - 但that's not the case支持SET SERDEPROPERTIES;例如,与column management进行比较

所以你必须用这种命令改变每个现有的分区

ALTER TABLE table_name PARTITION (ing_year=2016,ing_month=8,ing_day=31)
SET SERDEPROPERTIES ('field.delim' = '\u0001');

所以现在是时候运行SHOW PARTITIONS,在输出上应用几个RegEx来生成命令列表,运行这些命令,并且从此开心。

旁注:我可以告诉你,在最终实现CASCADE内容之前重命名一个列真是太痛苦了......

答案 1 :(得分:1)

您无法为外部表格改变SERDER属性。 你可以做的是删除表和外部源之间的链接。 示例如果是Hbase表,您可以这样做: 1)ALTER TABLE MY_HIVE_TABLE SET TBLPROPERTIES('hbase.table.name'='MY_HBASE_NOT_EXISTING_TABLE') MY_HBASE_NOT_EXISTING_TABLE必须是nott现有表。 2)DROP TABLE MY_HIVE_TABLE; 3)通过指定新的SERDE属性来重新创建配置单元表 创建外部表MY_HIVE_TABLE(  MY_colums ) 行格式SERDER   '...' 与SERDEPROPERTIES( ...) TBLPROPERTIES(   'hbase.table.name'= 'z_app_qos_hbase_temp:MY_HBASE_GOOD_TABLE');

答案 2 :(得分:-1)

将此命令用于更改400

SERDEPROPERTIES