Gunakan CTAS dan INSERT INTO untuk bekerja di sekitar batas partisi 100 - Amazon Athena

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
  1. MenggunakanCREATE EXTERNAL TABLEpernyataan untuk membuat tabel dipartisi pada bidang yang Anda inginkan.

    Contoh pernyataan berikut partisi data dengan koloml_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/'
  2. JalankanSHOW PARTITIONS <table_name>perintah seperti berikut untuk daftar partisi.

    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 */
  3. Jalankan CTAS kueri untuk membuat tabel yang dipartisi.

    Contoh berikut membuat tabel yang disebutmy_lineitem_parq_partitioneddan menggunakanWHERE klausa untuk membatasiDATEke 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');
  4. JalankanSHOW PARTITIONSperintah 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 */
  5. MenggunakanINSERT INTOpernyataan 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');
  6. 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 */
  7. 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 menyetelWHEREkondisi, pastikan bahwa permintaan tidak tumpang tindih. Jika tidak, beberapa partisi mungkin memiliki data yang diduplikasi.