【问题标题】:Hive alter serde properties not workingHive 更改 serde 属性不起作用
【发布时间】:2016-08-09 13:41:16
【问题描述】:

我正在尝试使用 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/'

【问题讨论】:

  • “但是当我从 HDFS 中选择时,这些值都是 NULL”是什么意思?你的意思是HiveImpala 吗?
  • 在 HIVE 中,Alter 表正在更改分隔符,但无法正确选择值。它返回 null。
  • 查看创建表时使用的语句也会有所帮助
  • 表是很久以前创建的,现在我正在尝试将分隔符从逗号更改为 ctrl+A。

标签: hadoop hive hdfs


【解决方案1】:

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

它不适用于现有分区,除非该特定命令支持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,在输出中应用几个正则表达式来生成命令列表,运行这些命令,然后永远快乐。

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

【讨论】:

  • 但我收到错误消息,失败:执行错误,从 org.apache.hadoop.hive.ql.exec.DDLTask 返回代码 1。无法更改分区。改变是不可能的
  • 该死,又一个 Hive 功能不起作用... 解决方法:因为它是一个外部表,您可以安全地删除每个分区,然后使用相同的 location 再次添加它 - 它会从父表继承新的默认SerDeProperties
  • ...但一如既往,在仅包含可消耗数据文件的分区上测试此技巧。如您所知,Hive DDL 命令存在大量错误,并且可能不时发生意外的数据破坏。
  • 谢谢,我已经通过删除和重新创建工作进行了测试,问题是我从 2015 年开始在 PROD 中进行分区。重新创建需要特别小心,这就是我试图通过 alter 进行更改的原因,但很明显它不会起作用:(
  • 好的,那你为什么不 (1) 重命名 HDFS 目录 (2) DROP 现在指向稀薄空气的分区 [没有可能的数据丢失...] (3) 在新位置添加分区?
【解决方案2】:

您不能更改外部表的 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');

【讨论】:

    【解决方案3】:

    把这个命令改成SERDEPROPERTIES.

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

    【讨论】:

      猜你喜欢
      • 2017-08-26
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2020-01-21
      • 2014-07-21
      相关资源
      最近更新 更多