Hiveでバケット化:Hiveでバケット化テーブルを作成します

公開: 2021-02-17

大きなデータセットでの作業は難しい場合があります。 追跡することがたくさんあり、1つの小さなエラーがワークフロー全体を妨げる可能性があります。 大規模なデータセットを管理するための最も優れたツールの1つは、バケット化です。

この記事では、Hiveでバケット化を実行する方法について説明します。 例を通して、この関数の複数の実装を調べます。

目次

ハイブのバケットとは何ですか?

バケッティングはデータ編成手法です。 Hiveのパーティション分割とバケット化は非常によく似た概念ですが、バケット化は、大きなデータセットをバケットと呼ばれるより小さく管理しやすいセットに分割する追加機能を提供します。

Hiveのバケット化を使用すると、テーブルデータセットを小さな部分に分解して、処理しやすくすることができます。 バケッティングを使用すると、類似したデータ型をグループ化して1つのファイルに書き込むことができます。これにより、テーブルの結合やデータの読み取り中のパフォーマンスが向上します。 これが、ほとんどの場合、パーティション化でバケット化を使用する大きな理由です。

いつバケットを使用しますか?

バケット化は非常に便利な機能です。 これまでに使用したことがない場合は、この機能をいつ使用するかを決定するために、次の点に注意する必要があります。

  • カーディナリティが高い列では、パーティション分割を実行できません。 パーティションの数が非常に多いと、生成されるHadoopファイルが多すぎて、ノードの負荷が増加します。 これは、ノードがすべてのパーティションのメタデータを保持する必要があり、それがそのノードのパフォーマンスに影響を与えるためです。
  • クエリに複数のマップ側の結合がある場合は、バケットを使用する必要があります。 マップ側結合は、reduce関数を使用せずにmap関数のみを使用して2つのテーブルを結合するプロセスです。

ハイブでのバケットのハイライト

バケット化はハッシュ関数に基づいているため、次のハイライトがあります。

  • hash_functionは、使用しているバケット列の種類によって異なります。
  • 同じバケット列を持つレコードは同じバケットに格納されることに注意してください。
  • この関数では、ClusteredBy句を使用してテーブルをバケットに分割する必要があります。
  • テーブルディレクトリでは、バケットの番号付けは1から始まり、すべてのバケットはファイルです。
  • バケット化はスタンドアロン機能です。 これは、テーブルでパーティショニングを実行せずにバケット化を実行できることを意味します。
  • バケット化されたテーブルは、ほぼ均等に分散されたデータファイルセクションを作成します。
  • バケット化は、テーブルが適切に設定されることを保証しないことに注意してください。 そのため、バケットへのデータの読み込みを自分で管理する必要があり、これは面倒な場合があります。

読む: HiveとSpark

ハイブでのバケット化:例1

例を使用して、Hiveのバケット化を理解するのが最善です。 この例では、次のデータを使用します。

EMPID ファーストネーム苗字スポーツ
1001 エメリーブレアバスケットボールクスバラプールサンマリノ
1002 ゼフールスティーブンソンクリケットネールハーレンドミニカ共和国
1003 バスケットボールネールハーレンドミニカ共和国
1004 カシミールヴァンスバドミントンネールハーレンドミニカ共和国
1005 ムフタウフローレス クスバラプールサンマリノ
1006 アヤンナ銀行フットボールネールハーレンドミニカ共和国
1007 セルマテニスクスバラプールサンマリノ
1008 バークフラーバドミントンネールハーレンドミニカ共和国
1009 イモジーンテレル クスバラプールサンマリノ
1010 コロラドハッチンソンテニスクスバラプールサンマリノ

サンプルデータには、スポーツチームの従業員情報が含まれています。 ただし、一部の従業員はどのチームにも所属していません。

この例に沿ってコピー&ペーストできるサンプルデータは次のとおりです。

id、FirstName、LastName、Sports、City、Country

1001、エメリー、ブレア、バスケットボール、クスバラプール、サンマリノ

1002、Zephr、Stephenson、Cricket、Neerharen、ドミニカ共和国

1003、秋、豆、バスケットボール、ネールハーレン、ドミニカ共和国

1004、カシミール、ヴァンス、バドミントン、ネールハーレン、ドミニカ共和国

1005、Mufutau、Flores、Qutubullapur、San Marino

1006、Ayanna、Banks、Football、Neerharen、ドミニカ共和国

1007、セルマ、ボール、テニス、クスバラプール、サンマリノ

1008、バーク、フラー、バドミントン、ネールハーレン、ドミニカ共和国

1009、Imogene、Terrell ,, Qutubullapur、San Marino

1010、コロラド、ハッチンソン、テニス、クスバラプール、サンマリノ

バケット化により、データセットをより小さなセクションにクラスター化して最適化できることはすでに知っています。 ここで、このプロセスを完了する方法について説明しましょう。

ベーステーブルの作成

まず、employee_baseというテーブルを作成します。

CREATE TABLE db_bdpbase.employee_base(

INTを実装し、

名STRING、

姓文字列、

スポーツストリング、

市の文字列、

国文字列

)。

行形式の区切り

'、'で終了するフィールド

テキストファイルとして保存

TBLPROPERTIES(“ skip.header.line.count” =” 1”);

サンプルデータにはバケット化に必要のないヘッダーが含まれているため、「skipheader」プロパティを追加して削除します。

ベーステーブルへのデータのロード

サンプルデータには場所'/usr/bdp/hive/sample_data.csv'を使用し、次のコマンドを使用してテーブルにロードします。

LOAD DATA INPATH'/user/bdp/hive/sample_data.csv' INTO TABLE db_bdpbase.employee_base;

バケットテーブルの作成

このセクションでは、バケット化されたテーブルを作成します。 これで、パーティションありまたはパーティションなしのバケットテーブルを作成できます。

パーティション付きバケットテーブル

この場合、国はパーティション列であり、昇順で並べ替えたempid列をバケット化しました。

CREATE TABLE db_bdpbase.bucketed_pa​​rtition_tbl(

empid INT、

名STRING、

姓文字列、

スポーツストリング、

市STRING

)PARTITIONED BY(country STRING)

CLUSTERED BY(empid)

(empid ASC)によって4つのバケットにソートされました。

パーティションのないバケットテーブル

または、パーティションなしでバケットテーブルを作成することもできます。

CREATE TABLE db_bdpbase.bucketed_tbl_only(

empid INT、

名STRING、

姓文字列、

市の文字列、

国文字列

)。

CLUSTERED BY(empid)

(empid ASC)によって4つのバケットにソートされました。

ここでは、同じ列のempidにテーブルをバケット化しました。

プロパティの設定

Hiveのバケットのデフォルト設定は無効になっているため、値をtrueに設定して有効にしました。 次のプロパティは、テーブルに従ってクラスターとレデューサーの数を選択します。

SET hive.enforce.bucketing = TRUE; (Hive 2.x以降では必要ありません)

バケット化されたテーブルへのデータのロード

これまでに、サンプルデータを使用して2つのバケットテーブルと1つのベーステーブルを作成しました。 次に、パーティションのあるバケットテーブルで次のコマンドを使用して、ベーステーブルからバケットテーブルにデータをロードします。

INSERT OVERWRITE TABLE db_bdpbase.bucketed_pa​​rtition_tbl PARTITION(国)SELECT * FROM db_bdpbase.employee_base;

パーティションなしでバケットテーブルにデータをロードするには、次のコマンドを使用します。

INSERT OVERWRITE TABLE db_bdpbase.bucketed_tbl_only SELECT * FROM db_bdpbase.employee_base;

バケットテーブルデータの確認

バケット化されたテーブルにデータをロードした後、HDFSにデータがどのように格納されているかを確認します。 次のコードを使用して、パーティションのあるバケットテーブルを確認します。

hadoop fs -ls hdfs://sandbox.hortonworks.com:8020 / apps / hive / Warehouse / db_bdpbase.db /bucketed_pa​​rtition_tbl

バケットテーブルのデータストレージ

すべてのデータポイントは、次の式に従って特定のデータポイントにマップされます。

hash_function(bucket_column)モードnum_bucket

ここで、国に基づいて分割した最初のテーブルについて考えてみます。サンプルデータは次のセクションに分割されます。

EMPID ファーストネーム苗字スポーツ
1002 ゼフールスティーブンソンクリケットネールハーレンドミニカ共和国
1003 バスケットボールネールハーレンドミニカ共和国
1004 カシミールヴァンスバドミントンネールハーレンドミニカ共和国
1006 アヤンナ銀行フットボールネールハーレンドミニカ共和国
1008 バークフラーバドミントンネールハーレンドミニカ共和国

EMPID ファーストネーム苗字スポーツ
1001 エメリーブレアバスケットボールクスバラプールサンマリノ
1005 ムフタウフローレス クスバラプールサンマリノ
1007 セルマテニスクスバラプールサンマリノ
1009 イモジーンテレル クスバラプールサンマリノ
1010 コロラドハッチンソンテニスクスバラプールサンマリノ

ドミンカン共和国の場合、すべての行がバケットに格納されます。

hash_function(1002)モード4 = 2(バケットのインデックスを表す)

hash_function(1003)モード4 = 3

hash_function(1004)モード4 = 0

hash_function(1006)モード4 = 2

hash_function(1008)モード4 = 0

INT値のhash_functionでも同じ結果が得られることに注意してください。 HDFSの場所にあるすべてのファイルのデータを確認できます。 必要に応じて、データベースに存在する他の国に対してこのプロセスを繰り返すことができます。

ハイブでのバケット化:例2

この関数を実装する際のさまざまな手順と手順についてはすでに説明したので、簡単に試すことができます。 以下は、Hiveでのバケット化の簡単な例です。 ここでは、利用可能なデータをさまざまな部分にバケット化しただけなので、より簡単に管理できます。

0:jdbc:hive2://cdh-vm.dbaglobe.com:10000/def>テーブルmonthly_taxi_fleet6を作成

。>(month char(7)、fleet smallint、company varchar(50))

。>(会社)によって3つのバケットにクラスター化

。>avroとして保存されます。

Apache Hiveバージョン1.1.0を使用した例-cdh5.13.1、デフォルトではhive.enforce.bucketing = false

0:jdbc:hive2://cdh-vm.dbaglobe.com:10000/def>monthly_taxi_fleet6に挿入

。>monthly_taxi_fleetから月、フリート、会社を選択します。

[upgrad @ cdh-vm〜] $ hdfs dfs -ls -R / user / hive / Warehouse / monthly_taxi_fleet6

-rwxrwxrwt1アップグレードハイブ254832017-12-2610:40 / user / hive / Warehouse / monthly_taxi_fleet6 / 000000_0

— hive.enforce.bucketing:バケット化が実施されているかどうか。 trueの場合、テーブルへの挿入中にバケット化が適用されます。

—デフォルト値:Hive 0.x:false、Hive 1.x:false、Hive 2.x:削除され、事実上常にtrueになります(HIVE-12331)

0:jdbc:hive2://cdh-vm.dbaglobe.com:10000 / def> set hive.enforce.bucketing = true;

0:jdbc:hive2://cdh-vm.dbaglobe.com:10000/def>monthly_taxi_fleet6に挿入

。>monthly_taxi_fleetから月、フリート、会社を選択します。

[upgrad @ cdh-vm〜] $ hdfs dfs -ls -R / user / hive / Warehouse / monthly_taxi_fleet6

-rwxrwxrwt1アップグレードハイブ136112017-12-2610:43 / user / hive / Warehouse / monthly_taxi_fleet6 / 000000_0

-rwxrwxrwt1アップグレードハイブ60772017-12-2610:43 / user / hive / Warehouse / monthly_taxi_fleet6 / 000001_0

-rwxrwxrwt1アップグレードハイブ65892017-12-2610:43 / user / hive / Warehouse / monthly_taxi_fleet6 / 000002_0

0:jdbc:hive2://cdh-vm.dbaglobe.com:10000/def>拡張されたmonthly_taxi_fleet6について説明します。

+ —————————– + —————————————————- + ———- + – +

| col_name | data_type | コメント|

+ —————————– + —————————————————- + ———- + – +

| | char(7) | |

| フリート| int | |

| 会社| varchar(50) | |

| | NULL | NULL |

| 詳細なテーブル情報| Table(tableName:monthly_taxi_fleet6、dbName:default、owner:upgrad、createTime:1514256031、lastAccessTime:0、retention:0、sd:StorageDescriptor(cols:[FieldSchema(name:month、type:char(7)、comment:null) 、FieldSchema(name:fleet、type:smallint、comment:null)、FieldSchema(name:company、type:varchar(50)、comment:null)]、location:hdfs://cdh-vm.dbaglobe.com:8020 /user/hive/warehouse/monthly_taxi_fleet6、inputFormat:org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat、outputFormat:org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat、compressed:false、numBuckets :3、serdeInfo:SerDeInfo(name:null、serializationLib:org.apache.hadoop.hive.serde2.avro.AvroSerDe、parameters:{serialization.format = 1})、bucketCols:[company]、sortCols:[]、parameters :{}、skewedInfo:SkewedInfo(skewedColNames:[]、skewedColValues:[]、skewedColValueLocationMaps:{})、storedAsSubDirectories:false)、partitionKeys:[]、parameters:{totalSize = 26277、numRows = 1128、rawDataSize = 0、COLUMN_STATS_ACCURATE = true、numFiles = 3、tra nsient_lastDdlTime = 1514256192}、viewOriginalText:null、viewExpandedText:null、tableType:MANAGED_TABLE)| |

+ —————————– + —————————————————- + ———- + – +

5行を選択(0.075秒)

チェックアウト:基本的なハイブインタビューの質問

ハイブでのバケット化:例3

以下は、Hiveでのバケット化の少し高度な例です。 ここでは、パーティショニングを実行し、並べ替え機能を使用してデータにアクセスしやすくしました。 これは、バケット化の最大の利点の1つです。 他の機能と併用して、大規模なデータセットをより効率的かつ効果的に管理できます。

0:jdbc:hive2://cdh-vm.dbaglobe.com:10000/def>テーブルを毎月作成_taxi_fleet7

。>(month char(7)、fleet smallint)

。>(company varchar(50))で分割

。>(月)でクラスター化(月)で3つのバケットに並べ替え

。>avroとして保存されます。

0:jdbc:hive2://cdh-vm.dbaglobe.com:10000/def>monthly_taxi_fleet7に挿入

。>パーティション(会社)

。>monthly_taxi_fleetから月、フリート、会社を選択します。

[upgrad @ cdh-vm〜] $ hdfs dfs -ls -R / user / hive / Warehouse / monthly_taxi_fleet7

drwxrwxrwt –ハイブのアップグレード0 2017-12-26 11:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = CityCab

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = CityCab / 000000_0

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = CityCab / 000001_0

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = CityCab / 000002_0

drwxrwxrwt –ハイブのアップグレード0 2017-12-26 11:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Comfort

-rwxrwxrwt1アップグレードハイブ9132017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Comfort / 000000_0

-rwxrwxrwt1アップグレードハイブ9132017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Comfort / 000001_0

-rwxrwxrwt1アップグレードハイブ9132017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Comfort / 000002_0

drwxrwxrwt –ハイブのアップグレード0 2017-12-26 11:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company=IndividualYellow-トップ

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Individual Yellow- Top / 000000_0

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Individual Yellow- Top / 000001_0

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Individual Yellow- Top / 000002_0

drwxrwxrwt –ハイブのアップグレード0 2017-12-26 11:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Premier

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Premier / 000000_0

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Premier / 000001_0

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Premier / 000002_0

drwxrwxrwt –ハイブのアップグレード0 2017-12-26 11:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Prime

-rwxrwxrwt1アップグレードハイブ7652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Prime / 000000_0

-rwxrwxrwt1アップグレードハイブ7652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Prime / 000001_0

-rwxrwxrwt1アップグレードハイブ7662017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Prime / 000002_0

drwxrwxrwt –ハイブのアップグレード0 2017-12-26 11:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = SMRT

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = SMRT / 000000_0

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = SMRT / 000001_0

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = SMRT / 000002_0

drwxrwxrwt –ハイブのアップグレード0 2017-12-26 11:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Smart

-rwxrwxrwt1アップグレードハイブ7202017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Smart / 000000_0

-rwxrwxrwt1アップグレードハイブ7192017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Smart / 000001_0

-rwxrwxrwt1アップグレードハイブ7192017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = Smart / 000002_0

drwxrwxrwt –ハイブのアップグレード0 2017-12-26 11:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = TransCab

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = TransCab / 000000_0

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = TransCab / 000001_0

-rwxrwxrwt1アップグレードハイブ8652017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = TransCab / 000002_0

drwxrwxrwt –ハイブのアップグレード0 2017-12-26 11:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = YTC

-rwxrwxrwt1アップグレードハイブ4322017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = YTC / 000000_0

-rwxrwxrwt1アップグレードハイブ4322017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = YTC / 000001_0

-rwxrwxrwt1アップグレードハイブ4322017-12-2611:05 / user / hive / Warehouse / monthly_taxi_fleet7 / company = YTC / 000002_0

Hiveでのパーティション分割とバケット化の詳細

以前に共有した例では、Hiveでパーティション分割とバケット化を複数の方法で実行し、それらをHiveで実装する方法について学習しました。 ただし、Apache Hiveには他にも多くの機能があり、それらすべてについて学ぶことは非常に困難な場合があります。

そのため、データエンジニアリングコースを受講することをお勧めします。 それはあなたがこの業界で何年も過ごした業界の専門家から学ぶことを可能にするでしょう。 コースは、すべてを段階的に学ぶ構造化されたカリキュラムを提供します。 upGradでは、専用のデータエンジニアリングコースを提供しています。

私たちのコースでは、upGradのStudent Success Cornerにアクセスして、個人的な履歴書のフィードバック、面接の準備、キャリアカウンセリング、およびその他の多くの利点を得ることができます。

コースを修了すると、熟練したデータエンジニアリングの専門家になります。

結論

Hiveでのバケット化は非常にシンプルで、簡単に実行できます。 これは確かに大規模なデータセットに役立つ関数です。 ただし、Hiveでパーティショニングとバケット化の両方を一緒に実行すると、非常に膨大なデータセットを非常に簡単に管理できます。

ビッグデータプログラムについて詳しく知りたい場合は、ビッグデータプログラムのソフトウェア開発スペシャライゼーションのPGディプロマをチェックしてください。これは、働く専門家向けに設計され、7つ以上のケーススタディとプロジェクトを提供し、14のプログラミング言語とツール、実用的なハンズをカバーしています。ワークショップでは、トップ企業との400時間以上の厳格な学習と就職支援。

バケット化に関して質問や考えがある場合は、以下のコメントで共有してください。 あなたからの御一報をお待ちしています。

upGradで他のソフトウェアエンジニアリングコースを確認してください。

自分をスキルアップして未来に備える

IIITバンガロアからのビッグデータの高度な証明書プログラム