レビュー| HIVEランダムサンプリング2



Review Hive Random Sampling 2



640?wx_fmt = png

前の記事、3つのサンプリングメカニズムの1つ

レビュー:チャットハイブのランダムサンプリング1



今日残っている2つ、 バレルサンプリングデータブロックのサンプリング

640?wx_fmt = png




データ量が特に多い場合、データ全体の処理が難しい場合はサンプリングが特に重要です。サンプリングは、抽出されたデータから全体的な特性を推定および推測できます。これは、科学実験、品質テスト、および社会調査で一般的に使用される費用効果の高い作業および調査方法です。

Hiveは、バケットテーブルサンプリングとブロックサンプリングをサポートしています。これらについては、以下で個別に説明します。いわゆるバケットテーブルとは、テーブルの作成時にCLUSTEREDBY句を使用してバケットが作成されたテーブルを指します。バケットテーブルのサンプリングの構文は次のとおりです。

table_sample: TABLESAMPLE (BUCKET x OUT OF y [ON colname])

TABLESAMPLE句を使用すると、FROM句に表示され、任意のテーブルで使用できるテーブル全体ではなく、データサンプリングのクエリを記述できます。バケット番号は1から始まり、colnameは抽出されるサンプルの列を示します。パーティション化されていない列の任意の列にすることができます。または、rand()を使用して、サンプルが取得されることを示します。行全体。 colnameのバケットの行は、ランダムに1からyのバケットに入り、バケットxに属する行を返します。次の例では、32個のバケットの3番目の行を返します。



SELECT *
FROM source TABLESAMPLE(BUCKET 3 OUT OF 32 ON rand()) s

通常、TABLESAMPLEはテーブル全体をスキャンしてサンプルを抽出しますが、これは明らかにあまり効率的ではありません。別の方法として、CLUSTERED BYを使用するときにバケットの列が指定されるため、TABLESAMPLE句で指定された列がCLUSTERED BY句の列と一致する場合、TABLESAMPLEはテーブルで必要なパーティションのみをスキャンします。上記の例では、ソーステーブルがCLUSTEREDBY id INTO 32 BUCKETSで作成された場合、各バケットは(32/16)= 2クラスター構成であるため、次のステートメントは3番目と19番目のクラスターの行を返します。単純なhaギリシャのアルゴリズム(3%16 = 19%16)。

TABLESAMPLE(BUCKET 3 OUT OF 16 ON id)

代わりに、各バケットは(32/64)= 1/2クラスターで構成されているため、次のステートメントは3番目のクラスターの半分を返します。

TABLESAMPLE(BUCKET 3 OUT OF 64 ON id)

ブロックサンプリングは、Hive-0.8以降で使用できます。構文は次のとおりです。

block_sample: TABLESAMPLE (n PERCENT)

このステートメントでは、データのサイズの少なくともn%(行数ではなく、データのサイズ)を入力として抽出できます。 CombineHiveInputFormatをサポートし、一部の特別な圧縮形式は処理できません。サンプリングが失敗した場合、MapReduceジョブの入力は全体になります。テーブル。サンプリングはHDFSブロックレベルで実行されるため、サンプリングの粒度はブロックのサイズです。たとえば、ブロックサイズが256 MBの場合、入力n%が100 MBしかない場合でも、256MBのデータが取得されます。以下の例の0.1%以上の入力は、クエリに使用されます。

SELECT *
FROM source TABLESAMPLE(0.1 PERCENT) s

異なるブロックで同じデータを抽出する場合は、次のパラメーターを変更できます。

set hive.sample.seednumber=<INTEGER>

読み取ったデータの長さを指定することもできます。このメソッドには、PERCENTサンプルと同じ制限があります。なぜ同じ制限があるのですか?この構文は、パーセンテージを特定の値に変更するだけで、ブロックサンプリングの前提を変更しません。構文は次のとおりです。

block_sample: TABLESAMPLE (ByteLengthLiteral)

ByteLengthLiteral : (Digit)+ ('b' | 'B' | 'k' | 'K' | 'm' | 'M' | 'g' | 'G')

以下の例で入力された100M以上がクエリに使用されます。

SELECT *
FROM source TABLESAMPLE(100M) s

Hiveは、効果が上記の2つと異なる場合、行数に基づく入力制限もサポートします。まず、CombineHiveInputFormatは必要ありません。つまり、非ネイティブテーブルで使用できます。次の行数が各分割で使用されます。したがって、行の総数は、入力された分割の数によって大きく異なります。構文は次のとおりです。

block_sample: TABLESAMPLE (n ROWS)

たとえば、次のクエリは各分割から10行を抽出します。

SELECT * FROM source TABLESAMPLE(10 ROWS)

より多くのビッグデータの知識、ビッグデータの学習スキル、スパークチューニング、ソースコードなど、参加を歓迎します 知識の惑星

推奨読書:

Scalaジェネリックとタイプ制限の詳細な説明

Scalaジェネリックとタイプ制限の詳細な説明

重要| mrはhcatalogを使用してハイブテーブルの読み取りと書き込みを行います

640?wx_fmt = jpeg