如何创建镶木地板分区 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
如果Partition不在metastore中,如何得到350万的计数?
SELECT
COUNT(*)
FROM
"default"."reviews"
WHERE
product_category='Automotive'
-- OUTPUT
3516476
如何确保所有记录都被正确读取并可用?
这个镶木地板分区 table 是如何创建的?我问是因为我有一个 csv table,我想以完全相同的方式进行分区。
分区的概念在 Athena 中仅用于限制应扫描哪些 "directories" 数据。
由于 MSCK REPAIR TABLE
命令失败,因此未创建任何分区。因此,WHERE product_category='Automotive'
没有任何影响,我会说 3516476 是 s3://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
为了确保所有记录都正确读取你必须确保table定义是正确的。
为了确保所有记录都 可用 你必须确保 LOCATION
指向根
"directory" 所有文件在 S3 上的位置。
如果你有一个包含列 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`
这是一个按预期工作的示例 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
如果Partition不在metastore中,如何得到350万的计数?
SELECT COUNT(*) FROM "default"."reviews" WHERE product_category='Automotive' -- OUTPUT 3516476
如何确保所有记录都被正确读取并可用?
这个镶木地板分区 table 是如何创建的?我问是因为我有一个 csv table,我想以完全相同的方式进行分区。
分区的概念在 Athena 中仅用于限制应扫描哪些 "directories" 数据。 由于
下所有 csv 文件中的总行数MSCK REPAIR TABLE
命令失败,因此未创建任何分区。因此,WHERE product_category='Automotive'
没有任何影响,我会说 3516476 是s3://amazon-reviews-pds/parquet/
.注意,
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
为了确保所有记录都正确读取你必须确保table定义是正确的。 为了确保所有记录都 可用 你必须确保
LOCATION
指向根 "directory" 所有文件在 S3 上的位置。如果你有一个包含列
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`