【问题标题】:Use part of filename to add as a field/column使用文件名的一部分添加为字段/列
【发布时间】:2013-07-23 11:09:19
【问题描述】:

我每天(通过 wget)将 5 个文件保存到 /tmp,以便在 bash 脚本中加载到 hdfs。

donaldDuck-2013-07-20.zip
mickeyMouse-2013-07-20.zip
goofyGoof-2013-07-20.zip
plutoStar-2013-07-20.zip
bigBadWolf-2013-07-20.zip

文件名的日期部分是动态的。

然后我如何告诉 hadoop 加载 5 个文件中的每一个?我听说了一些关于循环的事情。

for file in /tmp/*; do
echo "Running ${file##*/} ...."
done

我是否将 echo 行替换为“hadoop fs -put...”语句?会是什么样子?

【问题讨论】:

    标签: bash for-loop hadoop filenames hdfs


    【解决方案1】:

    你可以这样做:

    #!/bin/bash
    
    when=$(date "+%Y-%m-%d") #output like 2013-07-23
    names=(donaldDuck mickeyMouse goofyGoof plutoStar bigBadWolf)
    
    for file in "${names[@]}"
    do
            ls -l $file-$when.zip #output like donaldDuck-2013-07-23.zip
    done
    

    说明

    名称存储在数组$names 中。因此,我们可以使用for file in "${names[@]}" 循环遍历它。同时,我们将日期存储在$when 中,以便格式与$file-$when.zip 匹配。

    【讨论】:

      【解决方案2】:

      我会这样做:

      hdfsdir=/path/to/hdfs/output/dir
      datethru=`date "+%Y-%m-%d" --date="3 days ago"` # replace by how many days ago you want
      for i in `ls /tmp/*-$datethru.zip`; do
          hadoop fs -put $i $hdfsdir
      done
      

      这实际上将抓取您目录中包含特定日期并以 .zip 结尾的所有文件,并将这些文件中的每一个上传到 hdfs 中的特定目录。

      【讨论】:

      • for i in /tmp/*-$datethru.zip - 解析 ls 的输出时更安全、更干净。
      猜你喜欢
      • 2020-07-18
      • 2022-11-11
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多