【发布时间】:2019-09-10 20:59:51
【问题描述】:
在我的 hdfs 文件夹中,我不断地获取输入文件。我想从过去 15 分钟合并多个具有相同标题的 csv 文件,并制作一个具有一个标题的 csv 文件。我尝试使用-getmerge,但没有成功。请问各位大神指点一下?
【问题讨论】:
在我的 hdfs 文件夹中,我不断地获取输入文件。我想从过去 15 分钟合并多个具有相同标题的 csv 文件,并制作一个具有一个标题的 csv 文件。我尝试使用-getmerge,但没有成功。请问各位大神指点一下?
【问题讨论】:
我指的是下面的链接以获取在过去“5 分钟”内处理的文件列表。
Get the list of files processed in last 5 minutes 由于您想跳过单个标题并将所有列出的文件与单个标题合并。 可以将这些文件获取到本地 unix,如下所示:
#!/bin/bash
filenames=`hdfs dfs -ls /user/vikct001/dev/hadoop/external/csvfiles/part* | tr -s " " | cut -d' ' -f6-8 | grep "^[0-9]" | awk 'BEGIN{ MIN=5;LAST=60*MIN; "date +%s" | getline NOW } { cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(DIFF < LAST){ print $3 }}' `
for file in $filenames
do
#echo $file
hdfs dfs -get ${file} /home/vikct001/user/vikrant/shellscript/testfiles
done
一旦您在本地拥有列出的文件。可以使用以下命令合并所有具有单个标题的文件。
awk '(NR == 1) || (FNR > 1)' /home/vikct001/user/vikrant/shellscript/testfiles/part*.csv > bigfile.csv
这里有一个链接,了解更多关于此的详细信息。 Merge csv with a single header
上面链接中提到了更多命令,但我发现这是最合适的。
【讨论】: