Hive INSERT OVERWRITE DIRECTORY命令输出未由分隔符分隔.为什么?

Anu*_*oop 12 hadoop hive

我正在加载的文件由''(空格)分隔.以下是文件.该文件位于HDFS中: -

001 000
001 000
002 001
003 002
004 003
005 004
006 005
007 006
008 007
099 007
Run Code Online (Sandbox Code Playgroud)

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';
Run Code Online (Sandbox Code Playgroud)

2>在此之后,我只是通过发出以下命令将表插入另一个文件: -

INSERT OVERWRITE DIRECTORY '/user/hadoop/output' SELECT * FROM graph_edges;
Run Code Online (Sandbox Code Playgroud)

3>现在,当我捕获文件时,字段不会被任何分隔符分隔: -

hadoop dfs -cat /user/hadoop/output/000000_0
Run Code Online (Sandbox Code Playgroud)

输出: -

001000
001000
002001
003002
004003
005004
006005
007006
008007
099007
Run Code Online (Sandbox Code Playgroud)

有人可以帮帮我吗?为什么要删除分隔符以及如何分隔输出文件?

在我试过的CREATE TABLE命令中DELIMITED BY '\t'然后我得到了不必要的NULL列.

任何指针都非常感谢.我正在使用Hive 0.9.0版本.

kgu*_*u87 17

问题是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 .
Run Code Online (Sandbox Code Playgroud)

如上所述,带有空格.

  • 这完全奏效了.非常感谢你.所以我学到的一点是,在Hive中,为了保留格式化/分隔符,外部表应该始终写入另一个外部表,虽然在某种程度上我觉得这个限制是一个bug. (2认同)

Gar*_*n S 12

虽然这个问题已经超过2年了,当时最重要的答案是正确的,但现在可以告诉Hive将分隔数据写入目录.

以下是使用传统^ A分隔符输出数据的示例:

INSERT OVERWRITE DIRECTORY '/output/data_delimited'
SELECT *
FROM data_schema.data_table
Run Code Online (Sandbox Code Playgroud)

现在使用制表符分隔符:

INSERT OVERWRITE DIRECTORY '/output/data_delimited'
row format delimited 
FIELDS TERMINATED BY '\t'
SELECT *
FROM data_schema.data_table
Run Code Online (Sandbox Code Playgroud)

  • [从这里](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Writingdataintothefilesystemfromqueries):"自定义分隔符仅支持Hive版本0.11.0到1.1.0中的LOCAL写入 - 这个错误在版本1.2.0中修复(参见HIVE-5672)" (3认同)

Sid*_*Sid 11

我认为使用concat_ws函数可以实现输出;

INSERT OVERWRITE DIRECTORY'/ user/hadoop/output'SELECT concat_ws(',',col1,col2)FROM graph_edges;

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