Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Gunakan CTAS dan INSERT INTO untuk bekerja di sekitar batas partisi 100
Athena memiliki batas 100 partisi per CREATE TABLE AS SELECT
() CTASkueri. Demikian pula, Anda dapat menambahkan maksimum 100 partisi ke tabel tujuan dengan INSERTINTOpernyataan.
Jika Anda melebihi batasan ini, Anda mungkin menerima pesan kesalahan HIVE_ _ _ TOO MANY OPEN _PARTITIONS: Melebihi batas 100 penulis terbuka untuk partisi/ember
. Untuk mengatasi batasan ini, Anda dapat menggunakan CTAS pernyataan dan serangkaian INSERT INTO
pernyataan yang membuat atau menyisipkan hingga 100 partisi masing-masing.
Contoh dalam topik ini menggunakan database bernama tpch100
yang datanya berada di lokasi bucket Amazon S3 s3://amzn-s3-demo-bucket/.
Untuk menggunakan CTAS dan INSERT INTO membuat tabel lebih dari 100 partisi
-
Menggunakan
CREATE EXTERNAL TABLE
pernyataan untuk membuat tabel dipartisi pada bidang yang Anda inginkan.Contoh pernyataan berikut partisi data dengan kolom
l_shipdate
. Tabel ini memiliki 2525 partisi.CREATE EXTERNAL TABLE `tpch100.lineitem_parq_partitioned`( `l_orderkey` int, `l_partkey` int, `l_suppkey` int, `l_linenumber` int, `l_quantity` double, `l_extendedprice` double, `l_discount` double, `l_tax` double, `l_returnflag` string, `l_linestatus` string, `l_commitdate` string, `l_receiptdate` string, `l_shipinstruct` string, `l_comment` string) PARTITIONED BY ( `l_shipdate` string) 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://amzn-s3-demo-bucket/lineitem/'
-
Jalankan
SHOW PARTITIONS
perintah seperti berikut untuk daftar partisi.<table_name>
SHOW PARTITIONS lineitem_parq_partitioned
Berikut ini adalah hasil sampel parsial.
/* l_shipdate=1992-01-02 l_shipdate=1992-01-03 l_shipdate=1992-01-04 l_shipdate=1992-01-05 l_shipdate=1992-01-06 ... l_shipdate=1998-11-24 l_shipdate=1998-11-25 l_shipdate=1998-11-26 l_shipdate=1998-11-27 l_shipdate=1998-11-28 l_shipdate=1998-11-29 l_shipdate=1998-11-30 l_shipdate=1998-12-01 */
-
Jalankan CTAS kueri untuk membuat tabel yang dipartisi.
Contoh berikut membuat tabel yang disebut
my_lineitem_parq_partitioned
dan menggunakanWHERE
klausa untuk membatasiDATE
ke awal dari1992-02-01
. Karena set data sampel dimulai dengan Januari 1992, hanya partisi untuk Januari 1992 dibuat.CREATE table my_lineitem_parq_partitioned WITH (partitioned_by = ARRAY['l_shipdate']) AS SELECT l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_commitdate, l_receiptdate, l_shipinstruct, l_comment, l_shipdate FROM tpch100.lineitem_parq_partitioned WHERE cast(l_shipdate as timestamp) < DATE ('1992-02-01');
-
Jalankan
SHOW PARTITIONS
perintah untuk memverifikasi bahwa tabel berisi partisi yang Anda inginkan.SHOW PARTITIONS my_lineitem_parq_partitioned;
Partisi dalam contoh adalah dari Januari 1992.
/* l_shipdate=1992-01-02 l_shipdate=1992-01-03 l_shipdate=1992-01-04 l_shipdate=1992-01-05 l_shipdate=1992-01-06 l_shipdate=1992-01-07 l_shipdate=1992-01-08 l_shipdate=1992-01-09 l_shipdate=1992-01-10 l_shipdate=1992-01-11 l_shipdate=1992-01-12 l_shipdate=1992-01-13 l_shipdate=1992-01-14 l_shipdate=1992-01-15 l_shipdate=1992-01-16 l_shipdate=1992-01-17 l_shipdate=1992-01-18 l_shipdate=1992-01-19 l_shipdate=1992-01-20 l_shipdate=1992-01-21 l_shipdate=1992-01-22 l_shipdate=1992-01-23 l_shipdate=1992-01-24 l_shipdate=1992-01-25 l_shipdate=1992-01-26 l_shipdate=1992-01-27 l_shipdate=1992-01-28 l_shipdate=1992-01-29 l_shipdate=1992-01-30 l_shipdate=1992-01-31 */
-
Menggunakan
INSERT INTO
pernyataan untuk menambahkan partisi ke tabel.Contoh berikut menambahkan partisi untuk tanggal dari bulan Februari 1992.
INSERT INTO my_lineitem_parq_partitioned SELECT l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_commitdate, l_receiptdate, l_shipinstruct, l_comment, l_shipdate FROM tpch100.lineitem_parq_partitioned WHERE cast(l_shipdate as timestamp) >= DATE ('1992-02-01') AND cast(l_shipdate as timestamp) < DATE ('1992-03-01');
-
Jalankan lagi
SHOW PARTITIONS
.SHOW PARTITIONS my_lineitem_parq_partitioned;
Tabel contoh sekarang memiliki partisi dari Januari dan Februari 1992.
/* l_shipdate=1992-01-02 l_shipdate=1992-01-03 l_shipdate=1992-01-04 l_shipdate=1992-01-05 l_shipdate=1992-01-06 ... l_shipdate=1992-02-20 l_shipdate=1992-02-21 l_shipdate=1992-02-22 l_shipdate=1992-02-23 l_shipdate=1992-02-24 l_shipdate=1992-02-25 l_shipdate=1992-02-26 l_shipdate=1992-02-27 l_shipdate=1992-02-28 l_shipdate=1992-02-29 */
-
Lanjutkan menggunakan
INSERT INTO
pernyataan yang membaca dan menambahkan tidak lebih dari 100 partisi masing-masing. Lanjutkan sampai Anda mencapai jumlah partisi yang Anda butuhkan.penting
Saat menyetel
WHERE
kondisi, pastikan bahwa permintaan tidak tumpang tindih. Jika tidak, beberapa partisi mungkin memiliki data yang diduplikasi.