如何创建镶木地板分区 table

How to create parquet partitioned table

这是一个按预期工作的示例 create table 语句。

CREATE EXTERNAL TABLE default.reviews(
  marketplace varchar(10), 
  customer_id varchar(15), 
  review_id varchar(15), 
  product_id varchar(25), 
  product_parent varchar(15), 
  product_title varchar(50), 
  star_rating int, 
  helpful_votes int, 
  total_votes int, 
  vine varchar(5), 
  verified_purchase varchar(5), 
  review_headline varchar(25), 
  review_body varchar(1024), 
  review_date date, 
  year int)
PARTITIONED BY ( 
  product_category varchar(25))
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://amazon-reviews-pds/parquet/';

当我修复 table 时,出现错误:

MSCK REPAIR TABLE default.reviews

Partitions not in metastore: reviews:product_category=Apparel reviews:product_category=Automotive

  1. 如果Partition不在metastore中,如何得到350万的计数?

    SELECT 
        COUNT(*) 
    FROM 
        "default"."reviews" 
    WHERE 
        product_category='Automotive'
    
    -- OUTPUT
    3516476
    
  2. 如何确保所有记录都被正确读取并可用?

  3. 这个镶木地板分区 table 是如何创建的?我问是因为我有一个 csv table,我想以完全相同的方式进行分区。

  1. 分区的概念在 Athena 中仅用于限制应扫描哪些 "directories" 数据。 由于 MSCK REPAIR TABLE 命令失败,因此未创建任何分区。因此,WHERE product_category='Automotive' 没有任何影响,我会说 3516476s3://amazon-reviews-pds/parquet/.

    下所有 csv 文件中的总行数

    注意,MSCK REPAIR TABLE 仅在 AWS S3 上的 "folder" 结构遵守 HIVE 约定时才有效:

    s3://amazon-reviews-pds/parquet/
    |
    ├── product_category=Apparel
    │   ├── file_1.csv
    │   | ...
    │   └── file_N.csv
    |                                 
    ├── product_category=Automotive
    │   ├── file_1.csv
    │   | ...
    │   └── file_M.csv
    
  2. 为了确保所有记录都正确读取你必须确保table定义是正确的。 为了确保所有记录都 可用 你必须确保 LOCATION 指向根 "directory" 所有文件在 S3 上的位置。

  3. 如果你有一个包含列 col_1, col_2, col_3, col_4 的巨大 csv 文件,并且你想按 col_4 对它进行分区,你会 需要使用 CTAS 查询语句,但是请记住 limitations 个这样的语句。

    或者,如果您已经有多个 csv 文件,每个文件都对应 col_4 中的一个值,那么 只需按照上述方式将它们上传到 S3。那么您应该使用以下 DDL 语句的组合:

    -- FIRST STATMENT
    CREATE EXTERNAL TABLE `my_database`.`my_table`(
      `col_1` string, 
      `col_2` string, 
      `col_3` string,
      )
    PARTITIONED BY ( 
      `col_4` string)
    ROW FORMAT SERDE 
      -- CHANGE AS APPROPRIATE
      'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
    STORED AS INPUTFORMAT
      -- CHANGE AS APPROPRIATE 
      'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
    OUTPUTFORMAT
      -- CHANGE AS APPROPRIATE 
      'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
    LOCATION
      's3://amazon-reviews-pds/parquet/';
    
    -- SECOND STATEMENT
    MSCK REPAIR TABLE `my_database`.`my_table`