기술나눔

하이브 파티션 테이블

2024-07-12

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

1.파티션 테이블:

Hive의 테이블 형식으로, 테이블의 데이터를 여러 개의 하위 집합(파티션)으로 나누어 각 파티션이 테이블의 특정 열 값에 대응하게 함으로써 쿼리 성능 및 데이터 관리 효율성을 향상시킬 수 있습니다. 분할된 테이블의 각 파티션은 별도의 디렉터리에 저장되며, 파티션은 테이블의 하나 이상의 열을 기반으로 정의됩니다. 분할된 테이블을 사용하는 주요 목적은 쿼리로 검색되는 데이터의 양을 줄여 쿼리 효율성을 높이는 것입니다.

과도한 파티셔닝으로 인해 작은 파일이 많이 생성되어 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]');

세 개의 파티션에 해당하는 세 개의 디렉터리가 HDFS에 생성된 것을 볼 수 있습니다. where 조건과 함께 select를 사용하여 쿼리하면 해당 파티션 디렉터리에서 데이터를 직접 찾을 수 있으므로 쿼리로 검색되는 데이터의 양이 줄어들고 성능이 향상됩니다.

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

2. 버킷 테이블:

이는 Hive의 또 다른 테이블 유형입니다. 테이블의 데이터를 해시 버킷화하면 특히 조인 및 집계 작업을 수행할 때 쿼리 성능이 더욱 향상될 수 있습니다. 버킷 테이블은 데이터를 고정된 수의 버킷으로 나누고 각 버킷은 별도의 파일에 저장됩니다.
------------------------------------- -버킷테이블의 특징----------------------------------------------- - -------
데이터 분할: 하나 이상의 열의 해시 값을 기반으로 고정된 수의 버킷에 데이터를 배포합니다.
파일 저장: 각 버킷의 데이터는 별도의 파일에 저장됩니다.
균일한 배포: 이상적으로는 데이터가 모든 버킷에 균등하게 배포되어 쿼리 성능이 향상됩니다.

  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의 경로를 보면 해당 열의 해시 값에 따라 데이터가 여러 버킷으로 나누어지는 것을 알 수 있습니다.