Chr*_*ite 18
没有有效的方法,您需要将所有数据移动到一个节点,然后再移回HDFS.
执行此操作的命令行scriptlet可能如下所示:
hadoop fs -text *_fileName.txt | hadoop fs -put - targetFilename.txt
Run Code Online (Sandbox Code Playgroud)
这将把所有匹配glob的文件捕获到标准输出,然后你将该流传递给put命令并将流输出到名为targetFilename.txt的HDFS文件
你遇到的唯一问题是你已经去过的文件名结构 - 如果你有固定的宽度,zeropadded数字部分会更容易,但在它的当前状态你会得到一个意想不到的lexigraphic顺序(1,10,100,1000 ,11,110等)而不是数字顺序(1,2,3,4等).您可以通过修改scriptlet来解决此问题:
hadoop fs -text [0-9]_fileName.txt [0-9][0-9]_fileName.txt \
[0-9][0-9[0-9]_fileName.txt | hadoop fs -put - targetFilename.txt
Run Code Online (Sandbox Code Playgroud)
Dmi*_*try 12
有一个执行此操作的API方法org.apache.hadoop.fs.FileUtil.copyMerge:
public static boolean copyMerge(
FileSystem srcFS,
Path srcDir,
FileSystem dstFS,
Path dstFile,
boolean deleteSource,
Configuration conf,
String addString)
Run Code Online (Sandbox Code Playgroud)
它srcDir
按字母顺序读取所有文件,并将其内容附加到dstFile.
如果你可以使用火花.可以这样做
sc.textFile("hdfs://...../part*).coalesce(1).saveAsTextFile("hdfs://...../filename)
Run Code Online (Sandbox Code Playgroud)
希望这是有效的,因为spark以分布式方式工作,你不必将文件复制到一个节点.虽然只是一个小心,但如果文件非常大,火花中的合并文件可能会很慢.
归档时间: |
|
查看次数: |
36273 次 |
最近记录: |