技術共有

Hive パーティション テーブル

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1.パーティションテーブル:

Hive のテーブル タイプの 1 つであり、テーブル内のデータを複数のサブセット (パーティション) に分割し、各パーティションがテーブル内の特定の列の値に対応することで、クエリのパフォーマンスとデータ管理の効率を向上させることができます。パーティション化されたテーブルの各パーティションは個別のディレクトリに保存され、パーティションはテーブル内の 1 つ以上の列に基づいて定義されます。パーティション テーブルを使用する主な目的は、クエリによってスキャンされるデータの量を削減し、それによってクエリの効率を向上させることです。

過度にパーティション分割すると、多数の小さなファイルが生成され、HDFS のパフォーマンスと MapReduce タスクの効率に影響を与える可能性があります。小さなファイルの結合操作は定期的に実行する必要があります。

  1. CREATE TABLE customer_data (
  2. customer_id STRING,
  3. name STRING,
  4. age INT,
  5. email STRING
  6. )
  7. PARTITIONED BY (city STRING)
  8. STORED AS ORC;
  9. select *
  10. from customer_data;
  11. -- 插入 New York 的数据
  12. INSERT INTO TABLE customer_data PARTITION (city='New York')
  13. VALUES
  14. ('1', 'John Doe', 30, '[email protected]'),
  15. ('2', 'Jane Smith', 25, '[email protected]'),
  16. ('3', 'Bob Johnson', 40, '[email protected]');
  17. -- 插入 Los Angeles 的数据
  18. INSERT INTO TABLE customer_data PARTITION (city='Los Angeles')
  19. VALUES
  20. ('4', 'Alice Brown', 32, '[email protected]'),
  21. ('5', 'Charlie Davis', 28, '[email protected]');
  22. -- 插入 Chicago 的数据
  23. INSERT INTO TABLE customer_data PARTITION (city='Chicago')
  24. VALUES
  25. ('6', 'Eve White', 45, '[email protected]'),
  26. ('7', 'Frank Black', 37, '[email protected]');

3 つのパーティションに対応する 3 つのディレクトリが HDFS 上に作成されていることがわかります。クエリに where 条件を指定して select を使用すると、対応するパーティション ディレクトリからデータが直接検索され、クエリによってスキャンされるデータの量が削減され、パフォーマンスが向上します。

SELECT * FROM customer_data WHERE city='New York';

2.バケットテーブル:

これは、Hive の別のテーブル タイプであり、テーブル内のデータをハッシュ バケット化することにより、特に結合および集計操作を実行する場合のクエリのパフォーマンスをさらに向上させることができます。バケット テーブルはデータを固定数のバケットに分割し、各バケットは別のファイルに保存されます。
-------------------------------------------------- -バケットテーブルの特徴------------------------------------------- -------
データのパーティショニング: 1 つ以上の列のハッシュ値に基づいて、データを固定数のバケットに分散します。
ファイル ストレージ: 各バケットのデータは別のファイルに保存されます。
均一な分散: 理想的には、データがすべてのバケットに均一に分散されるため、クエリのパフォーマンスが向上します。

  1. CREATE TABLE customer_data2 (
  2. customer_id STRING,
  3. name STRING,
  4. age INT,
  5. email STRING
  6. )
  7. CLUSTERED BY (customer_id) INTO 4 BUCKETS
  8. STORED AS ORC;
  9. -- 插入数据到分桶表
  10. --通过这些步骤,我们创建了一个按 customer_id 列进行分桶的 Hive 表 customer_data,并插入了具体的数据。
  11. INSERT INTO TABLE customer_data2 VALUES
  12. ('1', 'John Doe', 30, '[email protected]'),
  13. ('2', 'Jane Smith', 25, '[email protected]'),
  14. ('3', 'Bob Johnson', 40, '[email protected]'),
  15. ('4', 'Alice Brown', 32, '[email protected]'),
  16. ('5', 'Charlie Davis', 28, '[email protected]'),
  17. ('6', 'Eve White', 45, '[email protected]'),
  18. ('7', 'Frank Black', 37, '[email protected]'),
  19. ('8', 'Grace Green', 22, '[email protected]');
  20. select *
  21. from customer_data2;

HDFS 上のパスを見ると、対応する列のハッシュ値に応じてデータが異なるバケットに分割されることがわかります。