Hadoop:在HDFS中连接CSV文件的工具?

时间:2014-07-21 15:55:07

标签: hadoop hdfs

我有几个巨大的CSV文件,其结构存储在HDFS中。有没有工具可以将这些文件连接成一个CSV文件?

2 个答案:

答案 0 :(得分:4)

hadoop fs -cat myfiles/*.csv | hadoop fs -put - myfiles_together.csv

这会连接文件内容,然后通过put将其传递回HDFS。那里的-表示使用标准作为文件内容,而不是一些本地文件。这比拉下然后向上推更好,因为它没有使用磁盘。

所以,你可能会说"嘿!这不可扩展!"嗯,不幸的是,没有可扩展的方法来写出HDFS中的一个大文件。您必须在单个线程中顺序编写该单个文件。我的基本论点是,你将通过编写单个新文件来解决瓶颈问题,因此分发数据读取或任何棘手的事情都是没有意义的。


还有另一种方式:

编写使用身份映射器和身份缩减器(默认值)的MapReduce作业。将reducers的数量设置为1.这会将所有数据汇集到一个reducer中,然后写出一个文件。

这有拖沓记录的缺点,而不是保留记录顺序......这可能并不重要。

它也有作为MapReduce工作的缺点。与上面比较简单的事情相比,会有很大的开销。

答案 1 :(得分:2)

你可以用一个非常简单的猪工作来做到这一点。

A = LOAD '/path/to/csv/files/*.csv' as (SCHEMA);
STORE A into '/path/to/output';

但请记住,任何mapreduce作业(包括pig)的输出都将采用部分文件“s”的形式。

<强> @Donald: 我同意你的第二个选择。 (使用身份映射器和reducer)。唯一的问题是,输出将按键排序,我们无法控制此排序。

但我不同意这一点。

  

hadoop fs -cat myfiles / * .csv | hadoop fs -put - myfiles_together.csv   要求是连接几个巨大的csv文件。执行hdfs cat然后将其放回到hdfs意味着,所有这些数据都在客户端节点中处理,并且肯定会阻塞网络和客户端节点。