Hive查询插入到其他目录中

时间:2014-06-11 18:15:34

标签: hive

我在仓库目录中有一个名为balance的表,其中包含以下数据。

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的内部表,并使用。

将上述文件加载到余额表中
LOAD data local inpath '/home/cloudera/bal.txt' into table 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目录中会为该垃圾字符创建任何问题。

1 个答案:

答案 0 :(得分:1)

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

但是为了更具体地回答你的问题,hive使用的默认分隔符是^ A.这可能是您可以通过在执行插入时指定不同的分隔符来更改它:

insert overwrite directory '/user/cloudera/surenhive'
row format delimited fields terminated by ','
select * from balance;

或者,由于您似乎使用的是较旧版本的Hive,因此您可以使用正确的文件格式执行“create-table-as-select”,然后将表格设置为外部并删除它。这将只留下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;