【问题标题】:Loop over files in HDFS directory循环遍历 HDFS 目录中的文件
【发布时间】:2021-08-17 02:02:10
【问题描述】:

我需要遍历 Hadoop 文件系统中的所有 csv 文件。我可以列出 HDFS 目录中的所有文件

> hadoop fs -ls /path/to/directory
Found 2 items
drwxr-xr-x   - hadoop hadoop          2 2016-10-12 16:20 /path/to/directory/tmp
-rwxr-xr-x   3 hadoop hadoop 4691945927 2016-10-12 19:37 /path/to/directory/myfile.csv

并且可以使用

遍历标准目录中的所有文件
for filename in /path/to/another/directory/*.csv; do echo $filename; done

但是我怎样才能将两者结合起来呢?我试过了

for filename in `hadoop fs -ls /path/to/directory | grep csv`; do echo $filename; done

但这给了我一些废话,比如

Found
2
items
drwxr-xr-x

hadoop
hadoop
2    
2016-10-12
....

【问题讨论】:

  • hadoop fs -ls /path/to/directory | grep csv 应该给你一个标准输出行的列表,不一定只是文件名。
  • 在另一个问题中看到一个很好的循环方式:stackoverflow.com/questions/28685471/…

标签: bash hadoop hdfs


【解决方案1】:

这应该可以工作

for filename in `hadoop fs -ls /path/to/directory | awk '{print $NF}' | grep .csv$ | tr '\n' ' '`
do echo $filename; done

【讨论】:

  • 这就像一个魅力!但它会打印文件的整个路径。我怎样才能缩短它以便它只打印文件名??
  • 对于任何寻找类似解决方案的人,使用 'cut' 来获取子字符串。 $(echo $filename | cut -f4 -d/)
  • 如果有人能解释这是如何工作的就太好了
  • 当我在 shell 中运行它时它适用于我,但是当我通过脚本运行它时,循环只运行一次。输出是一个字符串,其中包含目录中每个文件的完整文件名。修剪操作删除换行符并将其替换为空格并将 -ls 输出的每一行转换为单个空格分隔的行。我该如何解决这个问题?
【解决方案2】:

-C 选项将仅显示文件路径。

for filename in $(hadoop fs -ls -C /path/to/directory/*.csv); do
    echo "${filename}"
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2020-11-05
    • 2013-09-20
    相关资源
    最近更新 更多