awk如何处理HDFS的目录?

xriantvc  于 2022-12-09  发布在  HDFS
关注(0)|答案(1)|浏览(220)

我想把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:命令行: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。我说的对吗?谁能给予我一个可行的解决方案来做到这一点?谢谢,前进。

wfypjpf4

wfypjpf41#

在我看来,您似乎想要访问hadoop文件系统上的文件。这是一个虚拟文件系统,您只能访问文件的元数据。如果您想对文件进行操作,那么首先在本地复制文件也很重要。这可以使用hadoop fs -get来完成。创建本地副本后,您可以开始对文件进行操作。但是,还有一种使用hadoop fs -cat的替代方法。
通常我会说Never parse the output of 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实际上是文件本身的权限。

相关问题