Hive 配置单元,不支持将表格文件格式从orc更改为拼花地板?

Hive 配置单元,不支持将表格文件格式从orc更改为拼花地板?,hive,alter-table,parquet,orc,Hive,Alter Table,Parquet,Orc,我有一张这样的蜂巢桌: CREATE TABLE `abtestmsg_orc`( `eventname` string COMMENT 'AB测试方案上报事件:ABTest', `eventtime` string COMMENT '事件上报时间', `sessionid` string COMMENT 'Session标识', `appkey` string COMMENT 'app标识', `deviceid` string COMMENT 'device标识'

我有一张这样的蜂巢桌:

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'
但它抛出了一个异常,这是一个微不足道的事实:

失败:执行错误,从返回代码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)
我猜这个例外意味着,当我更改文件格式时,hive不仅会更改表元数据,还会尝试将所有数据格式从orc更改为拼花。但从官方文档来看,它说:

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.**
但我想实现的是将其定位到拼花地板目录


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

您需要创建另一个表abtestmsg_parquet,该表存储为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/'

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

“警报表myTableName设置文件格式INPUTFORMAT'org.apache.hadoop.hive.ql.io.orc.orInputFormat'OUTPUTFORMAT'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'”SERDE'org.apache.hadoop.hive.ql.io.orc.OrcSerde'

也就是说,应该相应地传递INPUTFORMAT、OUTPUTFORMAT和SERDE。

是一篇类似的文章,我发现为了更改文件格式,在运行ALTERTABLE命令之前,我需要执行
use
,即使表名中包含模式。。。也就是说,这对spark.sql不起作用

但是如果您的模式是
myschema
,您可以这样做

hive> use myschema;
hive> ALTER TABLE myschema.abtestmsg_orc PARTITION(dt='<dt_to_migrate>') SET FILEFORMAT PARQUET 
hive>使用myschema;
配置单元>改变表myschema.abtestmsg_orc分区(dt='')设置文件格式拼花地板
这将起作用,但如果没有
use
命令,它将不起作用

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;
hive> use myschema;
hive> ALTER TABLE myschema.abtestmsg_orc PARTITION(dt='<dt_to_migrate>') SET FILEFORMAT PARQUET