我在仓库目录中有一个名为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目录中会为该垃圾字符创建任何问题。
答案 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;