awk 如何处理 HDFS 的目录?

问题描述 投票:0回答:1

我想将HDFS的目录名与awk结合起来。这可行吗?目录名,而不是文件名。 这是我在本地的 awk 工作正常:

awk 'NR <= 1000 && FNR == 1{print FILENAME}' ./* 

然后我想将它与 hadoop fs -ls 结合起来,如下所示:

hadoop fs -ls xxx/* | xargs awk 'NR <= 1000 && FNR == 1{print FILENAME}'

但请告诉我:awk:cmd。第2行:致命:无法打开文件“-rwxrwxrwx”进行读取(没有这样的文件或目录)

我也尝试过:

awk 'NR <= 1000 && FNR == 1{print FILENAME}' < hadoop fs -ls xxx/*
awk 'NR <= 1000 && FNR == 1{print FILENAME}' < $(hadoop fs -ls xxx/*)
awk 'NR <= 1000 && FNR == 1{print FILENAME}' $(hadoop fs -ls xxx/*)

这些都失败了,这并不奇怪,我认为 awk 执行目录中的文件需要读取每个文件,而不是像文件内容那样可以将其作为流式传输给 awk。我对吗?谁能给我一个可行的解决方案来做到这一点?

提前致谢。

shell awk hdfs
1个回答
1
投票

在我看来,您想要访问 hadoop 文件系统上的文件。这是一个虚拟文件系统,您只能访问文件的元数据。如果您想对文件进行操作,首先将文件复制到本地也很重要。这可以使用

hadoop fs -get
来完成。创建本地副本后,您可以开始对文件进行操作。然而,还有另一种方法使用
hadoop fs -cat

通常我会说 永远不要解析

ls
的输出,但是对于 Hadoop,你在这里没有选择。
hadoop fs -ls
的输出与 Unix/Linux 命令
ls
的标准输出不同。它与
ls -l
密切相关,并返回以下输出:

permissions number_of_replicas userid groupid filesize modification_date modification_time filename

使用它并将其通过管道传输到

awk
,我们得到了可用文件的列表。所以我们现在可以设置一个 while 循环:

c=0
while read -r file; do
   [ $c -le 1000 ] && echo "${file}"
   nr=$(hadoop fs -cat "${file}" | wc -l)
   ((c+=nr))
done < <(hadoop fs -ls xxx/* | awk '!/^d/{print substr($0,index($8,$0))}')

注意:您最初的错误是由于

hadoop fs -ls
的非类unix输出造成的。程序
awk
收到了一个文件名
-rwxrwxrwx
,这实际上是文件本身的权限。

© www.soinside.com 2019 - 2024. All rights reserved.