【问题标题】:How does awk work with directory of HDFS?awk 如何处理 HDFS 的目录?
【发布时间】:2021-07-20 09:45:28
【问题描述】:

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

【问题讨论】:

  • 你能试试这个吗? awk 'NR &lt;= 1000 &amp;&amp; FNR == 1{print FILENAME}' &lt;(hadoop fs -ls xxx/*)
  • hadoop fs -ls xxx/* 的输出是什么?
  • 如何仅列出 HDFS 中的文件名 stackoverflow.com/questions/21569172/…,尤其是这看起来很有希望:stackoverflow.com/a/38740023/4162356
  • @BarathVutukuri 显示 /dev/fd/63 不起作用
  • 我明白了。您得到的错误意味着hadoop fs -ls 输出的文件信息不仅仅是名称,因此您需要摆脱那些额外的输出。我无法确定,因为您没有显示命令的实际输出,因此我只能提供解决问题的指针。祝你好运!

标签: shell awk hdfs


【解决方案1】:

在我看来,您想访问 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,这实际上是文件本身的权限。

【讨论】:

  • 我对 hadoop 文件或目录 (xxx) 名称一无所知,但它们是否可以包含空格,以便 hadoop fs -ls xxx/* | awk '!/^d/{print $NF}' 在这些情况下会失败?修改日期/时间格式是否会根据 ls -l 的文件年龄而有所不同?我在hadoop.apache.org/docs/current/hadoop-project-dist/… 看到hadoop 有一个fs -stat 命令——它可能比fs -ls 更健壮和/或更易于使用。
  • 文件中可能有空格,但创建带空格的文件似乎非常困难。 Hadoop 没有提供简单的文件列表系统或高级查找程序。当然可以根据$8 的位置创建一个构造。这可能有效
  • hadoop fs -stat '%n' 不能只获取文件名而不是 hadoop fs -ls 吗? Idk,从手册页上看好像那样可行。
  • 如果我们执行hadoop fs -stat "%n\0" 之类的操作,这可能会为所有文件名提供可靠的方式。
  • 所以,如果我想用awk来操作HDFS上的一些文件,另一方面,把这些文件作为参数传递给awk,这是不可能的,awk不能读取远程文件,我'已经换了另一种方式。
猜你喜欢
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 2017-09-29
  • 2019-11-24
  • 2016-03-05
相关资源
最近更新 更多