我有一个像这样的蜂巢表:
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更改为镶木地板,并将位置更改为包含镶木地板文件的其他hdfs目录。所以我首先尝试更改格式:
alter table abtestmsg_orc1 set fileformat parquet;
但它抛出一个异常是很可怜的:
失败:执行错误,从
返回代码1org.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)
我想这个例外意味着当我更改文件格式时,不仅hive会更改表元数据,还会尝试将所有数据格式从orc更改为parquet.But来自官方文档,它说:
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.**
但我想要的是将它的位置放在镶木地板目录中。
那么,我能做些什么才能实现这个目标呢?
答案 0 :(得分:2)
您需要创建另一个表abtestmsg_parquet,它是STORED AS 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;
答案 1 :(得分: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。
答案 2 :(得分:0)
How to Update/Drop a Hive Partition?
是类似的文章,在这里我发现为了更改文件格式,即使表名包含模式,我也需要在运行alter table命令之前先做use <schema>
,也就是说,这行不通用于spark.sql。
但是如果您的架构为myschema
,则可以
hive> use myschema;
hive> ALTER TABLE myschema.abtestmsg_orc PARTITION(dt='<dt_to_migrate>') SET FILEFORMAT PARQUET
这将起作用,但是如果没有use
命令,它将不会起作用。