我正在加载的文件以“”分隔(空白)。下面是文件。文件位于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版本。
10条答案
按热度按时间ih99xse11#
虽然这个问题已经有2年多的历史了,而且当时最重要的答案是正确的,但是现在可以告诉配置单元将分隔数据写入目录。
以下是使用传统的^a分隔符输出数据的示例:
现在使用制表符分隔符:
dojqjjoe2#
默认分隔符为“^a”。在python语言中,它是“\x01”。
当我想更改分隔符时,我使用sql,例如:
从表中选择col1,delimiter,col2,delimiter,col3
然后,将分隔符+“^a”视为新的分隔符。
ut6juiuv3#
问题是配置单元不允许您指定输出分隔符-https://issues.apache.org/jira/browse/hive-634
解决方案是为输出创建外部表(使用分隔符规范)并插入覆盖表而不是目录。
假设在hdfs中有/user/hadoop/input/graph\u edges.csv,
返回如上所述,与空间。
axkjgtzd4#
您可以使用此参数“行格式分隔字段,以“|”结尾”,例如在您的案例中,应该是
插入覆盖目录“/user/hadoop/output”行格式分隔字段,以“|”select*from graph|edges结尾;
0sgqnhkj5#
写入目录时可以提供分隔符
这应该对你有用。
4jb9z9bj6#
我认为使用concat\uws函数可以实现您的输出;
insert overwrite directory'/user/hadoop/output'从图形边缘选择concat\ws(',',col1,col2);
这里我选择逗号作为列分隔符
waxmsbnn7#
我想这将是一个更好的解决办法,尽管这是一个迂回的实现方式。
插入覆盖目录“/user/hadoop/output”select src\u node\u id“,dest\u node\u id from graph\u edges;
ki0zmccv8#
我怀疑hive实际上是在写一个控件-a作为delimeter,但是当你在屏幕上做一只猫的时候,它并没有出现在你的眼前。
相反,尝试在vi中打开文件,或者如果您只想看到一小部分文件,则将其置于vi中,结果是:
hadoop dfs-cat/user/hadoop/output/000000|0| head>my|u local|file.txt
vi我的本地文件.txt
您应该能够看到^a字符。
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'
:brccelvz10#
我遇到了这样一个问题,配置单元查询结果的输出应该用管道分隔。。运行此sed命令可以替换:
^A to |
sed 's#\x01#|#g' test.log > piped_test.log