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

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

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

  1. 001 000
  2. 001 000
  3. 002 001
  4. 003 002
  5. 004 003
  6. 005 004
  7. 006 005
  8. 007 006
  9. 008 007
  10. 099 007

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

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

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

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

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

output:-

  1. 001000
  2. 001000
  3. 002001
  4. 003002
  5. 004003
  6. 005004
  7. 006005
  8. 007006
  9. 008007
  10. 099007

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

ih99xse1

ih99xse11#

虽然这个问题已经有2年多的历史了,而且当时最重要的答案是正确的,但是现在可以告诉配置单元将分隔数据写入目录。
以下是使用传统的^a分隔符输出数据的示例:

  1. INSERT OVERWRITE DIRECTORY '/output/data_delimited'
  2. SELECT *
  3. FROM data_schema.data_table

现在使用制表符分隔符:

  1. INSERT OVERWRITE DIRECTORY '/output/data_delimited'
  2. row format delimited
  3. FIELDS TERMINATED BY '\t'
  4. SELECT *
  5. 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,

  1. hive> create external table graph_edges (src string, dest string)
  2. > row format delimited
  3. > fields terminated by ' '
  4. > lines terminated by '\n'
  5. > stored as textfile location '/user/hadoop/input';
  6. hive> select * from graph_edges;
  7. OK
  8. 001 000
  9. 001 000
  10. 002 001
  11. 003 002
  12. 004 003
  13. 005 004
  14. 006 005
  15. 007 006
  16. 008 007
  17. 099 007
  18. hive> create external table graph_out (src string, dest string)
  19. > row format delimited
  20. > fields terminated by ' '
  21. > lines terminated by '\n'
  22. > stored as textfile location '/user/hadoop/output';
  23. hive> insert into table graph_out select * from graph_edges;
  24. hive> select * from graph_out;
  25. OK
  26. 001 000
  27. 001 000
  28. 002 001
  29. 003 002
  30. 004 003
  31. 005 004
  32. 006 005
  33. 007 006
  34. 008 007
  35. 099 007
  36. [user@box] hadoop fs -get /user/hadoop/output/000000_0 .

返回如上所述,与空间。

展开查看全部
axkjgtzd

axkjgtzd4#

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

0sgqnhkj

0sgqnhkj5#

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

  1. INSERT OVERWRITE DIRECTORY '/user/hadoop/output'
  2. ROW FORMAT DELIMITED
  3. FIELDS TERMINATED BY
  4. 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' :

  1. create external table graph_out (src string, dest string)
  2. row format delimited
  3. fields terminated by '\1'
  4. lines terminated by '\n'
  5. stored as textfile location '/user/hadoop/output';
brccelvz

brccelvz10#

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

相关问题