如何创建实木复合地板分区表

时间:2019-10-14 13:22:51

标签: amazon-athena

这是一个可以正常运行的示例创建表语句。

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/';

修复表时,出现错误:

  

MSCK修复表default.reviews

     

不在metastore中的分区:reviews:product_category =服装评论:product_category =汽车

  1. 如果该分区不在metastore中,我如何获得350万的计数?

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

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

1 个答案:

答案 0 :(得分:1)

  1. 分区概念仅在Athena中用于限制应扫描哪些“目录”中的数据。 由于MSCK REPAIR TABLE命令失败,因此未创建任何分区。因此,WHERE product_category='Automotive' 没有任何影响,我想说 3516476 s3://amazon-reviews-pds/parquet/下所有csv文件中的总行数。

    请注意,MSCK REPAIR TABLE仅在AWS S3上的“文件夹”结构遵守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. 为确保所有记录均正确读取,您必须确保表定义正确。 为了确保所有记录均可用,您必须确保LOCATION指向根目录 所有文件在S3上的“目录”。

  3. 如果您有一个庞大的csv文件,其列为col_1, col_2, col_3, col_4,并且您想按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`