我尝试使用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/'
答案 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