我有几个巨大的CSV文件,其结构存储在HDFS中。有没有工具可以将这些文件连接成一个CSV文件?
答案 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意味着,所有这些数据都在客户端节点中处理,并且肯定会阻塞网络和客户端节点。