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/’
- “但是当我从 HDFS 中选择时,值都是 NULL” 是什么意思?你的意思是 Hive 还是 Impala ?
- 在 HIVE 中,Alter 表正在更改分隔符,但无法正确选择值。它返回空值。
- 查看您用于创建表的语句也将有所帮助
- 表是很久以前创建的,现在我正在尝试将分隔符从逗号更改为 ctrl A。
分区表上的 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 内容最终实现之前重命名列真的很痛苦…
- 但我收到错误,失败:执行错误,从 org.apache.hadoop.hive.ql.exec.DDLTask 返回代码 1。无法更改分区。改变是不可能的
- 该死,另一个 Hive 功能不起作用… 解决方法:因为它是一个 EXTERNAL 表,您可以安全地删除每个分区,然后使用相同的 location 再次添加它——它将继承新的默认值 SerDeProperties 来自父表。
- …但与往常一样,在仅包含可消耗数据文件的分区上测试此技巧。如您所知,Hive DDL 命令有一大堆错误,并且可能不时发生意外的数据破坏。
- 谢谢,我已经通过删除和重新创建有效的方法进行了测试,问题是我从 2015 年开始在 PROD 中进行分区。重新创建需要特别小心,这就是我试图通过 alter 进行更改的原因,但很明显它不会起作用:(
- 好的,那你为什么不 (1) 重命名 HDFS 目录 (2) DROP 现在指向稀薄空气的分区 [没有可能的数据丢失…] (3) 在新位置添加分区?
- 是的@Samson,我们采用任何方法。
您不能更改外部表的 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’; |
来源:https://www.codenong.com/38852453/
