2

我有一个像这样的蜂巢表:

CREATE TABLE `abtestmsg_orc`(
  `eventname` string COMMENT 'AB测试方案上报事件:ABTest', 
  `eventtime` string COMMENT '事件上报时间', 
  `sessionid` string COMMENT 'Session标识', 
  `appkey` string COMMENT 'app标识', 
  `deviceid` string COMMENT 'device标识', 
  `content` string COMMENT 'AB测试方案的内容,格式是一个 json 字符串', 
  `item` array<struct<key:string,value:string>> COMMENT '扩展字段')
PARTITIONED BY ( 
  `dt` string COMMENT '??')
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
  'hdfs://hdfsmaster/hive/connector_transfer/abtestmsg_orc'

现在,我想将文件格式从 ORC 更改为 parquet 并将位置更改为包含 parquet 文件的其他 hdfs 目录。所以我首先尝试更改格式:

alter table abtestmsg_orc1 set fileformat parquet;

但遗憾的是它抛出了一个异常:

失败:执行错误,返回代码 1 从

org.apache.hadoop.hive.ql.exec.DDLTask. Changing file format (from ORC) is not supported for table connector_transfer.abtestmsg_orc1
Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Changing file format (from ORC) is not supported for table connector_transfer.abtestmsg_orc1 (state=08S01,code=1)

我猜这个异常意味着当我更改 fileformat 时,hive 不仅会更改表元数据,而且还会尝试将所有数据格式从 orc 更改为 parquet。但是从官方文档中,它说:

ALTER TABLE table_name [PARTITION partition_spec] SET FILEFORMAT file_format;

**This statement changes the table's (or partition's) file format. For available file_format options, see the section above on CREATE TABLE. The operation only changes the table metadata. Any conversion of existing data must be done outside of Hive.**

但我想要实现的是将其位置设置为镶木地板目录。

那么,我能做些什么来实现这一目标呢?

4

3 回答 3

2

您需要创建另一个表 abtestmsg_parquet,该表存储为 PARQUET,并带有您所需的镶木地板文件的位置:

CREATE TABLE abtestmsg_parquet(
  eventname string COMMENT 'AB测试方案上报事件:ABTest', 
  eventtime string COMMENT '事件上报时间', 
  sessionid string COMMENT 'Session标识', 
  appkey string COMMENT 'app标识', 
  deviceid string COMMENT 'device标识', 
  content string COMMENT 'AB测试方案的内容,格式是一个 json 字符串', 
  item array<struct<key:string,value:string>> COMMENT '扩展字段')
PARTITIONED BY ( 
  dt string COMMENT '??')
STORED AS PARQUET
LOCATION
  'hdfs://hdfsmaster/hive/connector_transfer/abtestmsg_parquet/'

然后您可以使用动态分区创建文件。跑:

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

INSERT INTO TABLE abtestmsg_parquet PARTITION(dt)

SELECT eventname, eventtime, sessionid, appkey, deviceid, content, item, dt
FROM abtestmsg_orc;
于 2017-02-08T09:14:00.747 回答
1

在我的情况下,如果我的意思是将格式更改为 ORC,则更改文件格式的命令是:

"alert table myTableName set FILEFORMAT INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'" SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde';

即 INPUTFORMAT、OUTPUTFORMAT 和 SERDE 应该对应传递。

于 2019-08-29T09:18:52.333 回答
0

如何更新/删除 Hive 分区? 是一篇类似的文章,我在其中发现为了更改文件格式,我需要use <schema>在运行 alter table 命令之前执行此操作,即使表名包含架构……也就是说,这不适用于 spark.sql。

但是,如果您的架构是myschema,您可以这样做

hive> use myschema;
hive> ALTER TABLE myschema.abtestmsg_orc PARTITION(dt='<dt_to_migrate>') SET FILEFORMAT PARQUET 

这将起作用,但如果没有命令,它将无法正常工作。use

于 2020-04-17T21:58:18.270 回答