关于 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/’
  • “但是当我从 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/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?