关于 hadoop:Hive alter serde properties not working

Hive alter serde properties not working

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

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

在 DDL 之后我可以看到变化

1
show create table table_name

但是当我从 Hive 中选择时,这些值都是 NULL(HDFS 中的基础文件更改为具有 ctrl 分隔符)。

我也使用 msck 修复了表。

查看数据的唯一方法是删除并重新创建外部表,谁能帮我理解原因。

表格语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 '\
'
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'hdfs://location/'


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

但它不适用于现有分区,除非该特定命令支持 CASCADE 选项——但 SET SERDEPROPERTIES 不是这种情况;与 instance

的列管理进行比较

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

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

所以现在是时候运行 SHOW PARTITIONS,在输出上应用几个 RegEx 以生成命令列表,运行这些命令,然后永远快乐。

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


您不能更改外部表的 SERDER 属性。
您可以做的是删除表和外部源之间的链接。
例如,如果是 Hbase 表,您可以执行以下操作:
1) ALTER TABLE MY_HIVE_TABLE SET TBLPROPERTIES('hbase.table.name'='MY_HBASE_NOT_EXISTING_TABLE')
MY_HBASE_NOT_EXISTING_TABLE 必须是不存在的表。
2) 删除表 MY_HIVE_TABLE;
3) 通过指定新的 SERDE 属性重新创建配置单元表
创建外部表 MY_HIVE_TABLE(
MY_colums
)
行格式SERDE
"……"
具有SERDE属性(
...)
TBL 属性 (
'hbase.table.name'='z_app_qos_hbase_temp:MY_HBASE_GOOD_TABLE');


将此命令用于更改 SERDEPROPERTIES.

1
2
alter table airlinetestcsv
SET SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde';