配置单元插入覆盖目录命令输出未用分隔符分隔为什么?

llycmphe  于 2021-06-03  发布在  Hadoop
关注(0)|答案(10)|浏览(268)

我正在加载的文件以“”分隔(空白)。下面是文件。文件位于hdfs:-

001 000
001 000
002 001
003 002
004 003
005 004
006 005
007 006
008 007
099 007

1> 我正在创建一个外部表并通过发出以下命令来加载文件command:-

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> 在此之后,我只需通过发出以下命令将表插入另一个文件中command:-

INSERT OVERWRITE DIRECTORY '/user/hadoop/output' SELECT * FROM graph_edges;

3> 现在,当我对文件进行cat时,字段之间没有任何分隔delimiter:-

hadoop dfs -cat /user/hadoop/output/000000_0

output:-

001000
001000
002001
003002
004003
005004
006005
007006
008007
099007

有人能帮帮我吗?为什么要删除分隔符以及如何分隔输出文件?
在create table命令中 DELIMITED BY '\t' 但是我得到了不必要的空列。
任何有帮助的指点都很感激。我正在使用Hive0.9.0版本。

ih99xse1

ih99xse11#

虽然这个问题已经有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
dojqjjoe

dojqjjoe2#

默认分隔符为“^a”。在python语言中,它是“\x01”。
当我想更改分隔符时,我使用sql,例如:
从表中选择col1,delimiter,col2,delimiter,col3
然后,将分隔符+“^a”视为新的分隔符。

ut6juiuv

ut6juiuv3#

问题是配置单元不允许您指定输出分隔符-https://issues.apache.org/jira/browse/hive-634
解决方案是为输出创建外部表(使用分隔符规范)并插入覆盖表而不是目录。

假设在hdfs中有/user/hadoop/input/graph\u 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 .

返回如上所述,与空间。

axkjgtzd

axkjgtzd4#

您可以使用此参数“行格式分隔字段,以“|”结尾”,例如在您的案例中,应该是
插入覆盖目录“/user/hadoop/output”行格式分隔字段,以“|”select*from graph|edges结尾;

0sgqnhkj

0sgqnhkj5#

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

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

这应该对你有用。

4jb9z9bj

4jb9z9bj6#

我认为使用concat\uws函数可以实现您的输出;
insert overwrite directory'/user/hadoop/output'从图形边缘选择concat\ws(',',col1,col2);
这里我选择逗号作为列分隔符

waxmsbnn

waxmsbnn7#

我想这将是一个更好的解决办法,尽管这是一个迂回的实现方式。
插入覆盖目录“/user/hadoop/output”select src\u node\u id“,dest\u node\u id from graph\u edges;

ki0zmccv

ki0zmccv8#

我怀疑hive实际上是在写一个控件-a作为delimeter,但是当你在屏幕上做一只猫的时候,它并没有出现在你的眼前。
相反,尝试在vi中打开文件,或者如果您只想看到一小部分文件,则将其置于vi中,结果是:
hadoop dfs-cat/user/hadoop/output/000000|0| head>my|u local|file.txt
vi我的本地文件.txt
您应该能够看到^a字符。

yduiuuwa

yduiuuwa9#

我有不同的声音。
实际上,配置单元不支持自定义分隔符。
但是当你使用 INSERT OVERWRITE DIRECTORY ,行中有分隔符。分隔符为 '\1' .
你可以用 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';
brccelvz

brccelvz10#

我遇到了这样一个问题,配置单元查询结果的输出应该用管道分隔。。运行此sed命令可以替换:
^A to | sed 's#\x01#|#g' test.log > piped_test.log

相关问题