シェルスクリプトを使用して変更された日付でフィルタリングし、hdfsフォルダから別のhdfsの場所にファイルをコピーします。

シェルスクリプトを使用して変更された日付でフィルタリングし、hdfsフォルダから別のhdfsの場所にファイルをコピーします。

HDFSの場所に1年間のデータがあり、過去6ヶ月間のデータを別のHDFSの場所にコピーしたいと思います。 hdfsコマンドから直接6ヶ月のデータをコピーできますか?それとも、過去6ヶ月のデータをコピーするにはシェルスクリプトを作成する必要がありますか?

私は成功せずにこれを行うためにhdfsコマンドを使ってみました。

以下のシェルスクリプトを試してみましたが、TempFileが作成されるまで正しく機能しますが、エラーが発生します。

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

スクリプトは実行されなくなりました。

以下は私が使用するシェルスクリプトです。

#!/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

エラーは何であり、回避策は何ですか?

答え1

hdfsの場所から別の場所に6ヶ月ファイルをコピーするには、次のスクリプトを使用できます。

スクリプトはローカル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にコピーします。その後、この一時ファイルを繰り返し、一致するものがあればファイルをコピーします。

Windowsでスクリプトを作成してLinuxシステムにコピーすると、機能しなくても構文エラーが表示されることがあります。キャリッジリターンエラーを回避するには、スクリプトをLinuxシステムのローカルパスにコピーし、次のコマンドを実行します。 sed -i 's/\r//' その後、スクリプトを実行してください>>>shファイル名.sh

関連情報