【发布时间】:2019-08-21 18:21:41
【问题描述】:
我在将数据从 HDFS 获取到本地时遇到问题。 例如:
/path/to/folder/report1/report1_2019_03_24-03_10*.csv
/path/to/folder/report1/report1_2019_03_24-04_12*.csv
...
/path/to/folder/report1/report1_2019_03_25-05_12*.csv
/path/to/folder/report1/report1_2019_03_25-06_12*.csv
/path/to/folder/report1/report1_2019_03_25-07_11*.csv
/path/to/folder/report1/report1_2019_03_25-08_13*.csv
/path/to/folder/report2/report2_out_2019_03_25-05_12*.csv
/path/to/folder/report2/report2_out_2019_03_25-06_11*.csv
/path/to/folder/report3/report3_TH_2019_03_25-05_12*.csv
所以我需要输入这些文件夹中的每一个(report1、report2、report3...但并非所有这些文件夹都以“report”开头),然后将之前 24 小时复制到本地的 CSV 文件,每个都应该这样做早上 4 点(我可以用 crontab 安排)。 问题是我不知道如何遍历文件并将时间戳作为参数传递。
我尝试过这样的事情(在 Stack Overflow 上找到)
/datalake/hadoop/bin/hadoop fs -ls /path/to/folder/report1/report1/* | tr -s " " | cut -d' ' -f6-8 | grep "^[0-9]" | awk 'BEGIN{ MIN=1440; LAST=60*MIN; "date +%s" | getline NOW } { cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(NOW > DIFF){ print "Migrating: "$3; system("datalake/hadoop/bin/hadoop fs -copyToLocal /path/to/local_dir/"$3) }}'
但这个是复制比我早几天的文件,它只复制一个目录中的文件(在本例中为报告 1)。
有什么方法可以让这更灵活和正确。如果这可以是 bash 的求解器,而不是 Python 的求解器,那就太好了。 欢迎任何建议或链接到具有类似问题的好答案。
此外,不必处于某个循环中。我可以为每个报告使用单独的代码行。
【问题讨论】:
-
可能是我理解的不对,为什么不直接复制
/path/to/folder/*或者/path/to/folder/report*呢? -
@Tiberiu 因为这些文件夹每天每小时都会收到报告(csv 文件),而且越来越大。我不需要所有这些文件,只需要前 24 小时的每一天。
-
啊,我明白了。我不确定 bash 命令是什么,但如果是我,我会有另一个文件夹结构,未复制的文件都将驻留在其中,所以你可以在那里获取所有内容。复制后,它们可以移动到一般的
report文件夹。将大大简化您的命令,并在出现问题时留下痕迹,但我是出于编程心态。 -
@Tiberiu 问题是我不是创建文件夹结构的人。如果没问题,我只适用于一个文件夹(报告),我可以使用该 bash 脚本,对任何其他文件夹稍作更改。
-
您是否尝试安装您的 HDFS(使用
hadoop-fuse-dfs或类似名称)?