2016-10-07 9 views
0

S3の生データに対するETLプロセスにHIVEを使用しています。私は別のデータベースに読み込む前にソートされた構造化出力データを生成します(赤色シフト)。 データは、ソートされた一連の管理可能なチャンク、たとえば、チャンクごとに510億行、合計データセットが100億個のレコードである場合、赤方偏移にロードする必要があります。HIVE - 大規模な順序付き問合せ結果セットを複数の順次ファイルに分割する

私はデータを並べ替える方法を探しています。それをソートされたシーケンスで個別にアップロードできる小さな管理可能なチャンクに分割します。 これまでのところ私はそれを可能にするアプローチを考え出すことができませんでした。私は "Oder By"節を使用してハイブの減速師の数を強制的に1にするので、1つのマンモスファイルが得られます! 私はそのような巨大なファイルをS3の中から解凍/分割/再圧縮/再ロードに移動する方法はありません。

"クラスターバイ"を使用すると、内部的にソートされたチャンクが生成されますが、チャンク間のシーケンスの保証はありません。

ソートバイキーは複合英数字キーであり、個別カウントは分割するには大きすぎます。クラスタと

問題/配布:クラスタに問題

をし、私の理解からオプションを配布する分布が分散キーのハッシュに基づいて起こるということです。 x < yの場合、hash(x)はhash(y)より小さくなることは保証されません。したがって、生成されるファイル全体では、データはソートされません。

答えて

-1

可能な解決策の1つは、ソートされた完全な出力に対してbash splitコマンドを使用して、小さなファイルに分割することです。

は、manページから取得されます:

NAME 
     split - split a file into pieces 

SYNOPSIS 
     split [OPTION]... [INPUT [PREFIX]] 

DESCRIPTION 
     Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default size is 1000 lines, and default PREFIX is 'x'. With no INPUT, or when INPUT is -, read 
     standard input. 

     Mandatory arguments to long options are mandatory for short options too. 

     -a, --suffix-length=N 
       use suffixes of length N (default 2) 

     -b, --bytes=SIZE 
       put SIZE bytes per output file 

     -C, --line-bytes=SIZE 
       put at most SIZE bytes of lines per output file 

     -d, --numeric-suffixes 
       use numeric suffixes instead of alphabetic 

     -l, --lines=NUMBER 
       put NUMBER lines per output file 

     --verbose 
       print a diagnostic just before each output file is opened 

     --help display this help and exit 

     --version 
       output version information and exit 

     SIZE may be (or may be an integer optionally followed by) one of following: KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y. 

だから、何かのように:

が働くかもしれない-l50億ファイル名を分割します。ハイブから

+0

私は既に私の記事でこれを行うにはS3からこのファイルを取って戻すスペースを持っていないと述べた。その1つのファイルは簡単に1TBになる可能性があります –

0

ロードS3: あなたはハイブのために外部ファイルを指定することができます(あなたはハイブ、ORDER BYを使用しているとき、一つの大きなファイルを生成します)LOCATION 's3://<bucket>/etcを使用してそうそしてハイブがS3に直接それを置くだろう。

手動で読み込む:並べ替え基準を使用すると、1つの減速器のデータを並べ替える必要があります。別々のものを使用してみましたので、データはソートされている間に特定のキーによって配布されます。

配布キーは、1つのバケット内にあるすべてのレコードが他のファイルに移動しないように選択する必要があります。

+0

私はすでにS3で1つの非常に大きなファイルを生成しました。しかし、私は一度にそれを読み込むことができないので、それを壊す方法が必要です。現在、配布キーの問題は、データがキーのハッシュに基づいて配布されることです。だから私のデータが名前でソートされているとしましょう。別のファイルに移動する名前のハッシュは、ファイル間でソート順を破ります。各ファイルは名前でソートされますが、ファイル間でデータはソートされません。 –

+0

はい、配布キーは論理的にデータを分割する必要があります。たとえば、学校に生徒のマークがあるとします。クラスごとに分割してマークを並べ替えると、データを使用することはできます。ここでMarksの大域ソート順は役に立ちません。可能であれば、ソースデータモデルを共有すれば、そのような提案が出るかもしれません。 –

0

テーブルをバケット化すると、より簡単に操作できるように、ほぼ等しいサイズのパーティションがいくつか作成されます。

Create table mytable (
record_ID string, 
var1 double 
) 
clustered by record_ID into 100 buckets; 


set hive.enforce.bucketing = true; 
from my_other_table 
insert overwrite table mytable 
select *; 

さらに、乱数を作成して分割することもできます。これは、ハイブでrandom()udfを使用することも同様に簡単です。

+0

record_IDを100個のバケットにクラスタリングすると、レコード1とレコード101が同じファイルに格納されます。レコード2と102は同じファイルに入ります。これは、私が探している並べ替え順序を破ります。 –

+0

注文を保存し、その上にテーブルを分割する変数を作成する必要があります。 – invoketheshell

関連する問題