蜂房INSERT OVERWRITE DIRECTORY命令输出未由分隔符隔开。 为什么?(Hi

2019-09-02 08:33发布

那我加载该文件是由“”(空格)分开。 下面是该文件。 该文件驻留在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版本。

Answer 1:

问题是,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 .

回来如上,用空格。



Answer 2:

我认为使用CONCAT_WS功能,你可以实现你的输出;

INSERT OVERWRITE DIRECTORY '/用户/ hadoop的/输出' SELECT CONCAT_WS( '' 中,col1,COL2)FROM graph_edges;

在这里,我选择了逗号作为列分隔符



Answer 3:

而问题是,超过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


Answer 4:

我有一些不同的声音。

事实上,蜂房不支持自定义分隔符。

但是,当你使用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”一些字符。

回到正题,你可以用一个简单的方法来解决这个问题。

  1. 仍然使用INSERT OVERWRITE DIRECTORY '/user/hadoop/output' ,以生成/user/hadoop/output ;

  2. 创建外部表,其通过分隔的字段'\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'; 


Answer 5:

你可以写目录时提供分隔符

INSERT OVERWRITE DIRECTORY '/user/hadoop/output'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY
SELECT * FROM graph_edges;

这应该为你工作。



Answer 6:

我有这个问题,即蜂巢查询结果的输出应该是管道分隔..运行此sed命令可以更换: ^A to |

sed 's#\x01#|#g' test.log > piped_test.log



Answer 7:

缺省分隔符为“^ A”。 在Python语言,它是“\ X01”。

当我想改变的分隔符,我用SQL这样的:

SELECT COL1,分隔符,COL2,分隔符,COL3,...... FROM表

然后,对于分隔符+“^ A”作为一个新的分隔符。



Answer 8:

我怀疑蜂箱其实正在写一控逆变-A作为分隔符,但是当你做一个猫屏幕它没有显示出来你的眼睛。

相反,尝试把该文件以vi或头文件,如果你只是想看到一个小的它,和VI的结果:

Hadoop的DFS -cat /用户/ Hadoop的/输出/ 000000_0 | 头> my_local_file.txt

六my_local_file.txt

你应该能够看到那里的^ A字符。



Answer 9:

这将是一个更好的解决办法,我想虽然它圆对实现的途径。

INSERT OVERWRITE DIRECTORY '/用户/ hadoop的/输出' SELECT src_node_id,””,dest_node_id FROM graph_edges;



Answer 10:

您可以使用此参数“的终止行格式分隔的字段‘|’”在你的情况下,例如应

INSERT OVERWRITE DIRECTORY通过终止“/用户/ hadoop的/输出”行格式分隔字段“|” SELECT * FROM graph_edges;



文章来源: Hive INSERT OVERWRITE DIRECTORY command output is not separated by a delimiter. Why?
标签: hadoop hive