Hive 配置单元查询插入到其他目录

Hive 配置单元查询插入到其他目录,hive,Hive,我有一个名为balance in warehouse directory的表,其中包含以下数据 Surender,HDFC,60000,CTS Raja,AXIS,80000,TCS Raj,HDFC,70000,TCS Kumar,AXIS,70000,CTS Remya,AXIS,40000,CTS Arun,SBI,30000,TCS 我创建了一个名为balance的内部表,并使用将上述文件加载到balance表中 LOAD data local inpath '/home/cloude

我有一个名为balance in warehouse directory的表,其中包含以下数据

Surender,HDFC,60000,CTS
Raja,AXIS,80000,TCS
Raj,HDFC,70000,TCS
Kumar,AXIS,70000,CTS
Remya,AXIS,40000,CTS
Arun,SBI,30000,TCS
我创建了一个名为balance的内部表,并使用将上述文件加载到balance表中

LOAD data local inpath '/home/cloudera/bal.txt' into table balance
现在,我只想将balance表中的所有行放入HDFS目录中

Insert overwrite directory '/user/cloudera/surenhive' select * from balance;
当我运行此查询时,所有数据也加载到HDFS中的上述目录中。 如果导航到/user/cloudera/surenhive,则可以看到数据,但数据之间存在一些垃圾字符。为什么会出现垃圾角色?如何移除这些

但是下面的查询给我的结果没有任何问题

Insert overwrite local  directory '/home/cloudera/surenhive' select * from balance;

如果我从本地加载文件并将输出存储到HDFS目录中,则会对垃圾字符产生任何问题。

首先,如果您已将数据加载到配置单元表中,则它已在HDFS中。执行“描述格式化平衡”,您将看到配置单元表的hdfs位置;文件在那里

但为了更具体地回答您的问题,配置单元使用的默认分隔符是^A。这可能是您在执行插入操作时可以通过指定其他分隔符来更改的情况:

insert overwrite directory '/user/cloudera/surenhive'
row format delimited fields terminated by ','
select * from balance;
或者,由于您使用的是较旧版本的配置单元,因此可以使用正确的文件格式执行“创建表作为选择”,然后将表设置为外部并将其删除。这将只剩下hdfs上的文件:

create table tmp
row format delimited fields terminated by ','
location '/user/cloudera/surenhive'
as select * from balance;

alter table tmp set tblproperties('EXTERNAL'='TRUE');

drop table tmp;

它是什么类型的垃圾字符?我尝试了上面的插入查询。位它抛出错误为“无法识别select子句中的输入行”您正在使用哪个版本的配置单元?我想这项功能是在0.11hive-hwi-0.7.1-cdh3u3.jarOk中添加的-我编辑了我的答案,加入了另一个应该适用于该版本的想法。我没有它可以测试,但我认为它只使用了已经存在很长时间的功能。非常好。我试过你说的,效果很好。多谢!!