那我加载该文件是由“”(空格)分开。 下面是该文件。 该文件驻留在HDFS: -
001 000
001 000
002 001
003 002
004 003
005 004
006 005
007 006
008 007
099 007
1>我创建外部表并通过发出以下命令加载文件: -
CREATE EXTERNAL TABLE IF NOT EXISTS graph_edges (src_node_id STRING COMMENT 'Node ID of Source node', dest_node_id STRING COMMENT 'Node ID of Destination node') ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' STORED AS TEXTFILE LOCATION '/user/hadoop/input';
2>在此之后,我只是通过发出以下命令将在另一个文件中的表格: -
INSERT OVERWRITE DIRECTORY '/user/hadoop/output' SELECT * FROM graph_edges;
3>现在,当我的猫的文件,字段不被任何分隔符分隔: -
hadoop dfs -cat /user/hadoop/output/000000_0
输出: -
001000
001000
002001
003002
004003
005004
006005
007006
008007
099007
可有人请帮助我吗? 为什么分隔符被删除,以及如何界定输出文件?
在CREATE TABLE命令我试过DELIMITED BY '\t'
但后来我得到不必要的NULL列。
任何指针帮助非常感谢。 我使用的蜂巢0.9.0版本。
问题是,HIVE不允许你指定输出分隔符- https://issues.apache.org/jira/browse/HIVE-634
的解决方案是创建外部表输出(与分隔符规范)并插入重写表而不是目录。
-
假设你在HDFS已经/user/hadoop/input/graph_edges.csv,
hive> create external table graph_edges (src string, dest string)
> row format delimited
> fields terminated by ' '
> lines terminated by '\n'
> stored as textfile location '/user/hadoop/input';
hive> select * from graph_edges;
OK
001 000
001 000
002 001
003 002
004 003
005 004
006 005
007 006
008 007
099 007
hive> create external table graph_out (src string, dest string)
> row format delimited
> fields terminated by ' '
> lines terminated by '\n'
> stored as textfile location '/user/hadoop/output';
hive> insert into table graph_out select * from graph_edges;
hive> select * from graph_out;
OK
001 000
001 000
002 001
003 002
004 003
005 004
006 005
007 006
008 007
099 007
[user@box] hadoop fs -get /user/hadoop/output/000000_0 .
回来如上,用空格。
我认为使用CONCAT_WS功能,你可以实现你的输出;
INSERT OVERWRITE DIRECTORY '/用户/ hadoop的/输出' SELECT CONCAT_WS( '' 中,col1,COL2)FROM graph_edges;
在这里,我选择了逗号作为列分隔符
而问题是,超过2岁,最多的回答是正确的时候,现在可以告诉蜂房来划界的数据写入到一个目录。
这里是输出与传统^ A分离器中的数据的一个示例:
INSERT OVERWRITE DIRECTORY '/output/data_delimited'
SELECT *
FROM data_schema.data_table
现在通过选项卡分隔符:
INSERT OVERWRITE DIRECTORY '/output/data_delimited'
row format delimited
FIELDS TERMINATED BY '\t'
SELECT *
FROM data_schema.data_table
我有一些不同的声音。
事实上,蜂房不支持自定义分隔符。
但是,当你使用INSERT OVERWRITE DIRECTORY
,也有你的行分隔符。 分隔符是'\1'
。
您可以使用hadoop dfs -cat $file | head -1 | xxd
hadoop dfs -cat $file | head -1 | xxd
hadoop dfs -cat $file | head -1 | xxd
找出来或者从HDFS文件到本地机器上用vim打开它。 会有像你的vim这是分隔符“^ A”一些字符。
回到正题,你可以用一个简单的方法来解决这个问题。
仍然使用INSERT OVERWRITE DIRECTORY '/user/hadoop/output'
,以生成/user/hadoop/output
;
创建外部表,其通过分隔的字段'\1'
:
create external table graph_out (src string, dest string) row format delimited fields terminated by '\1' lines terminated by '\n' stored as textfile location '/user/hadoop/output';
你可以写目录时提供分隔符
INSERT OVERWRITE DIRECTORY '/user/hadoop/output'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY
SELECT * FROM graph_edges;
这应该为你工作。
我有这个问题,即蜂巢查询结果的输出应该是管道分隔..运行此sed命令可以更换: ^A to |
sed 's#\x01#|#g' test.log > piped_test.log
缺省分隔符为“^ A”。 在Python语言,它是“\ X01”。
当我想改变的分隔符,我用SQL这样的:
SELECT COL1,分隔符,COL2,分隔符,COL3,...... FROM表
然后,对于分隔符+“^ A”作为一个新的分隔符。
我怀疑蜂箱其实正在写一控逆变-A作为分隔符,但是当你做一个猫屏幕它没有显示出来你的眼睛。
相反,尝试把该文件以vi或头文件,如果你只是想看到一个小的它,和VI的结果:
Hadoop的DFS -cat /用户/ Hadoop的/输出/ 000000_0 | 头> my_local_file.txt
六my_local_file.txt
你应该能够看到那里的^ A字符。
这将是一个更好的解决办法,我想虽然它圆对实现的途径。
INSERT OVERWRITE DIRECTORY '/用户/ hadoop的/输出' SELECT src_node_id,””,dest_node_id FROM graph_edges;
您可以使用此参数“的终止行格式分隔的字段‘|’”在你的情况下,例如应
INSERT OVERWRITE DIRECTORY通过终止“/用户/ hadoop的/输出”行格式分隔字段“|” SELECT * FROM graph_edges;
文章来源: Hive INSERT OVERWRITE DIRECTORY command output is not separated by a delimiter. Why?