HDFSでマイフォルダパス構造は、このようなものです。私はこれらの個々のディレクトリの中にあるすべてのファイルをパスに応じて単一の個別のファイル名にマージできるシェルスクリプトを作成しています。再帰的にHDFS
例:1に
すべてJSONs内部/データ/ます。topicName /年= 2017 /月= 02 /日= 28 /時間= 00は、内部のすべてのJSONs /データ/
full_2017_02_28_00.jsonファイルをマージ/ data/topicname/year = 2017/month = 02/day = 28/hour =トピック名/年= 2017 /月= 02/day = 28/hour = 01マージされたファイルに1つのマージファイルfull_2017_02_28_01.json
すべてのJSONは、 02を1つのマージ済みファイルfull_2017_02_28_02.jsonなどに変換します。
上記のパターンでファイル名を保持することは、私が達成しようとする副次的な仕事です。現在、私はファイル名をハードコードすることができます。
しかし、ディレクトリパス構造内の再帰的連結は起こっていません。
はこれまでのところ、私は以下試してみました:
hadoop fs -cat /data/topicname/year=2017/* | hadoop fs -put - /merged/test1.json
エラー: -
cat: `/data/topicname/year=2017/month=02/day=28/hour=00': Is a directory
cat: `/data/topicname/year=2017/month=02/day=28/hour=01': Is a directory
cat: `/data/topicname/year=2017/month=02/day=28/hour=02': Is a directory
再帰猫は、上記では起きていない
hadoop fs -ls /data/topicname/year=2017/month=02 | find /data/topicname/year=2017/month=02/day=28 -name '*.json' -exec cat {} \; > output.json
エラー試してください: -
をfind: ‘/data/topicname/year=2017/month=02/day=28’: No such file or directory
cannot write output to stream message is repeated multiple times
file /merged/output.json is repeated a few times
どのようにこれが達成可能である - :
それは上記の試みで
for i in `hadoop fs -ls -R /data/topicname/year=2017/ | cut -d' ' -f19` ;do `hadoop fs -cat $i/* |hadoop fs -put - /merged/output.json`; done
エラーをローカルFSの代わりに、HDFSで検索をしているのですか?私はスパークを使いたくない。
これは多くの時間を取っています。それは20分のように実行され、5MBのファイルサイズがマージされた10-15ファイルだけを追加することができました。 – earl
はい、fsshellを使用するとシーケンシャルで遅くなります。このソリューションは、投稿した質問の構文的に正しいバージョンです。並列処理を実現するには、MapReduceまたはSpark(使用しないと言いました)を使用します。 – franklinsijo