【问题标题】:Copy files from a hdfs folder to another hdfs location by filtering with modified date using shell script通过使用 shell 脚本过滤修改日期,将文件从 hdfs 文件夹复制到另一个 hdfs 位置
【发布时间】:2019-11-25 00:04:12
【问题描述】:

我的 hdfs 位置有 1 年的数据,我想将过去 6 个月的数据复制到另一个 hdfs 位置。 是否可以直接从 hdfs 命令复制仅 6 个月的数据,还是我们需要编写 shell 脚本来复制过去 6 个月的数据?

我已尝试使用 hdfs 命令执行此操作,但没有成功。

我尝试使用下面的 shell 脚本,它工作正常,直到创建 TempFile 但抛出错误

$ sh scriptnew.sh
scriptnew.sh: line 8: syntax error: unexpected end of file

并且脚本不会进一步执行。

下面是我使用的shell脚本。

#!/bin/bash
hdfs dfs -ls /hive/warehouse/data.db/all_history/ |awk 'BEGIN{ SIXMON=60*60*24*180; "date +%s" | getline NOW } { cmd="date -d'\''"$6" "$7"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-SIXMON; if(WHEN > DIFF){print $8}}' >> TempFile.txt
cat TempFile.txt |while read line
do
    echo $i
    hdfs dfs -cp -p $line /user/can_anns/all_history_copy/;
done

可能是什么错误以及如何解决?

【问题讨论】:

    标签: shell hadoop copy hdfs distcp


    【解决方案1】:

    我认为您可以通过如下所示的 shell 脚本在三个运行中完成此操作。这只是脚本的修改版本。我试过了,它对我有用。

    在每次运行中,需要将grep条件修改为所需月份为三个月。 (2019-03, 2019-02, 2019-01)

    脚本:

    hdfs dfs -ls /hive/warehouse/data.db/all_history/|grep "2019-03"|awk '{print $8}' >> Files.txt
    cat Files.txt |while read line
    do
        echo $i
        hdfs dfs -cp $line /user/can_anns/all_history_copy/;
    done
    

    希望有帮助!

    【讨论】:

    • 如果我给出“2019-03”,上面的代码不起作用,但它适用于特定日期,如“2019-03-01”。有没有可以一次性运行的脚本?
    • 你能试试第一行,看看它返回什么结果。它似乎对我有用。 hdfs dfs -ls -R /user/hive/warehouse/|grep "2019-07"|awk '{print $8}' /user/hive/warehouse/customers /user/hive/warehouse/customers/customers /user/hive/warehouse/sample_07
    • 打印正常。但是在复制时显示 -cp 命令的语法错误而失败。
    • @vikrant rana:我已经用进度和最新错误更新了问题。
    • @Gomz 在将文件从 Windows 复制到 linux 本地目录后,我尝试了 sed -i 's/\r//' script.sh,现在可以正常工作了。
    【解决方案2】:

    我假设数据集有日期列。因此,您可以在该数据集上创建一个外部配置单元表并仅提取所需的数据。

    如果给定日期有大量记录,shell 脚本的运行速度会很慢。

    【讨论】:

      【解决方案3】:

      要将 6 个月的文件从 hdfs 位置复制到另一个位置,我们可以使用以下脚本。

      脚本应该从您的本地 linux 位置运行。

      #!/bin/bash
      hdfs dfs -ls /hive/warehouse/data.db/all_history/ |awk 'BEGIN{ SIXMON=60*60*24*180; "date +%s" | getline NOW } { cmd="date -d'\''"$6" "$7"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-SIXMON; if(WHEN > DIFF){print $8}}' >> TempFile.txt
      cat TempFile.txt |while read line
      do
         echo $i
         hdfs dfs -cp -p $line /user/can_anns/all_history_copy/;
      done
      

      第 2 行:我们正在将最长 180 天的文件列表复制到 TempFile。 然后我们遍历这个 Temp 文件,如果找到匹配项,则复制该文件。

      如果您是从 windows 编写脚本并复制到 linux 机器,有时它可能无法显示语法错误。 为避免回车错误,将脚本复制到 linux 机器本地路径后运行以下命令。 sed -i 's/\r//' 然后运行脚本 >>> sh FileName.sh

      【讨论】:

        猜你喜欢
        • 2013-03-04
        • 2018-05-18
        • 1970-01-01
        • 1970-01-01
        • 2021-07-29
        • 2019-11-14
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多