hadoop:在hdfs中连接csv文件的工具?

vzgqcmou  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(281)

我有几个巨大的csv文件以相同的结构存储在hdfs中。有没有工具可以将这些文件连接到一个csv文件中?

ybzsozfc

ybzsozfc1#

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

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

但是请记住,任何mapreduce作业(包括pig)的输出都将以部件文件“s”的形式出现。
@唐纳德:我同意你的第二个选择(使用identity mapper和reducer)。唯一的问题是,输出将按键排序,我们无法控制这种排序。
但我不同意。
hadoop fs-cat myfiles/*.csv | hadoop fs-put-myfiles_together.csv要求连接几个巨大的csv文件。做一个hdfs cat,然后把它放回hdfs意味着,所有这些数据都在客户机节点中处理,肯定会阻塞网络和客户机节点。

vql8enpb

vql8enpb2#

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

这将连接文件内容,然后通过put将其传递回hdfs。这个 - 里面说的是用标准中的作为文件内容,而不是一些本地文件。这比向下拉然后向上推要好,因为它不使用磁盘。
所以,你可以说“嘿!这是不可伸缩的!”不幸的是,在hdfs中没有可伸缩的方法来写出一个大文件。你必须在一个线程中按顺序写一个文件。我的基本观点是,编写一个新文件会使您陷入瓶颈,因此分发数据读取或任何类似的棘手问题都是没有意义的。
还有另一种方法:
编写一个使用identity mapper和identity reducer(默认值)的mapreduce作业。将减速器的数量设置为1。这将把所有数据汇集到一个reducer中,然后reducer将写出一个文件。
这样做的缺点是洗牌的记录,而不是保持记录顺序。。。这也许无关紧要。
它还有一个缺点,那就是它是一个mapreduce工作。与上面更简单的方法相比,会有很大的开销。

相关问题