Membuat kueri inventaris Amazon S3 dengan Amazon Athena - Amazon Simple Storage Service

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Membuat kueri inventaris Amazon S3 dengan Amazon Athena

Anda dapat membuat kueri file Inventaris Amazon S3 dengan kueri SQL standar menggunakan Amazon Athena di semua Wilayah yang menyediakan Athena. Untuk memeriksa Wilayah AWS ketersediaan, lihat Wilayah AWS Tabel.

Athena dapat menanyakan file Inventaris Amazon S3 Apache kolom baris yang dioptimalkan (ORC), Apache Parquet, atau format nilai yang dipisahkan koma (CSV). Saat Anda menggunakan Athena untuk menanyakan file inventaris, kami sarankan Anda menggunakan format ORC atau Parquet-file inventaris yang diformat. Orc dan Parquet format memberikan kinerja kueri yang lebih cepat dan biaya kueri yang lebih rendah. ORC dan Parquet adalah format file kolumnar yang mendeskripsikan diri dan sadar tipe yang dirancang untuk Apache Hadoop. Format kolumnar memungkinkan pembaca membaca, mendekompresi, dan memproses hanya kolom yang diperlukan untuk kueri saat ini. Orc dan Parquet format untuk Inventaris Amazon S3 tersedia di semua. Wilayah AWS

Menggunakan Athena untuk membuat kueri file Inventaris Amazon S3
  1. Buat tabel Athena. Untuk informasi cara membuat tabel, lihat Membuat Tabel di Amazon Athena dalam Panduan Pengguna Amazon Athena.

  2. Buat kueri Anda dengan menggunakan salah satu templat kueri contoh berikut ini, tergantung pada apakah Anda membuat kueri berformat ORC, berformat Parket, atau berformat CSV untuk laporan inventaris.

    • Saat Anda menggunakan Athena untuk membuat kueri laporan inventaris yang berformat ORC, gunakan kueri sampel berikut sebagai templat.

      Kueri sampel berikut mencakup seluruh kolom opsional dalam laporan inventaris yang berformat ORC.

      Untuk menggunakan kueri sampel ini, lakukan hal berikut:

      • Ganti your_table_name dengan nama tabel Athena yang Anda buat.

      • Hapus bidang opsional yang tidak Anda pilih untuk inventaris sehingga kueri sesuai dengan bidang yang dipilih untuk inventaris Anda.

      • Ganti nama bucket dan lokasi inventaris berikut (ID konfigurasi) yang sesuai untuk konfigurasi Anda.

        s3://amzn-s3-demo-bucket/config-ID/hive/

      • Ganti 2022-01-01-00-00 tanggal di bawah projection.dt.range dengan hari pertama rentang waktu di mana Anda mempartisi data di Athena. Untuk informasi selengkapnya, lihat, Data partisi di Athena.

      CREATE EXTERNAL TABLE your_table_name( bucket string, key string, version_id string, is_latest boolean, is_delete_marker boolean, size bigint, last_modified_date timestamp, e_tag string, storage_class string, is_multipart_uploaded boolean, replication_status string, encryption_status string, object_lock_retain_until_date bigint, object_lock_mode string, object_lock_legal_hold_status string, intelligent_tiering_access_tier string, bucket_key_status string, checksum_algorithm string, object_access_control_list string, object_owner string ) PARTITIONED BY ( dt string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' LOCATION 's3://source-bucket/config-ID/hive/' TBLPROPERTIES ( "projection.enabled" = "true", "projection.dt.type" = "date", "projection.dt.format" = "yyyy-MM-dd-HH-mm", "projection.dt.range" = "2022-01-01-00-00,NOW", "projection.dt.interval" = "1", "projection.dt.interval.unit" = "HOURS" );
    • Saat Anda menggunakan Athena untuk menanyakan Parquet-laporan inventaris yang diformat, gunakan kueri sampel untuk laporan berformat ORC. Namun, gunakan yang berikut Parquet SerDe menggantikan ORC SerDe dalam ROW FORMAT SERDE pernyataan itu.

      ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
    • Saat Anda menggunakan Athena untuk membuat kueri laporan inventaris berformat CSV, gunakan kueri sampel berikut sebagai templat.

      Kueri sampel berikut mencakup seluruh kolom opsional dalam laporan inventaris berformat CSV.

      Untuk menggunakan kueri sampel ini, lakukan hal berikut:

      • Ganti your_table_name dengan nama tabel Athena yang Anda buat.

      • Hapus bidang opsional yang tidak Anda pilih untuk inventaris sehingga kueri sesuai dengan bidang yang dipilih untuk inventaris Anda.

      • Ganti nama bucket dan lokasi inventaris berikut (ID konfigurasi) yang sesuai untuk konfigurasi Anda.

        s3://amzn-s3-demo-bucket/config-ID/hive/

      • Ganti 2022-01-01-00-00 tanggal di bawah projection.dt.range dengan hari pertama rentang waktu di mana Anda mempartisi data di Athena. Untuk informasi selengkapnya, lihat, Data partisi di Athena.

      CREATE EXTERNAL TABLE your_table_name( bucket string, key string, version_id string, is_latest boolean, is_delete_marker boolean, size string, last_modified_date string, e_tag string, storage_class string, is_multipart_uploaded boolean, replication_status string, encryption_status string, object_lock_retain_until_date string, object_lock_mode string, object_lock_legal_hold_status string, intelligent_tiering_access_tier string, bucket_key_status string, checksum_algorithm string, object_access_control_list string, object_owner string ) PARTITIONED BY ( dt string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' LOCATION 's3://source-bucket/config-ID/hive/' TBLPROPERTIES ( "projection.enabled" = "true", "projection.dt.type" = "date", "projection.dt.format" = "yyyy-MM-dd-HH-mm", "projection.dt.range" = "2022-01-01-00-00,NOW", "projection.dt.interval" = "1", "projection.dt.interval.unit" = "HOURS" );
  3. Sekarang Anda dapat menjalankan berbagai kueri pada inventaris, seperti yang ditunjukkan dalam contoh-contoh berikut. Ganti masing-masing user input placeholder dengan informasi Anda sendiri.

    # Get a list of the latest inventory report dates available. SELECT DISTINCT dt FROM your_table_name ORDER BY 1 DESC limit 10; # Get the encryption status for a provided report date. SELECT encryption_status, count(*) FROM your_table_name WHERE dt = 'YYYY-MM-DD-HH-MM' GROUP BY encryption_status; # Get the encryption status for inventory report dates in the provided range. SELECT dt, encryption_status, count(*) FROM your_table_name WHERE dt > 'YYYY-MM-DD-HH-MM' AND dt < 'YYYY-MM-DD-HH-MM' GROUP BY dt, encryption_status;

    Saat Anda mengonfigurasi Inventaris S3 untuk menambahkan bidang Daftar Kontrol Akses Objek (ACL Objek) ke laporan inventaris, laporan tersebut akan menampilkan nilai untuk bidang ACL Objek sebagai string yang dienkodekan base64. Untuk mendapatkan nilai yang didekodekan dalam JSON untuk bidang ACL Objek, Anda dapat melakukan kueri pada bidang ini dengan menggunakan Athena. Lihat contoh-contoh kueri berikut. Untuk informasi selengkapnya tentang bidang ACL Objek, lihatMenggunakan bidang ACL Objek .

    # Get the S3 keys that have Object ACL grants with public access. WITH grants AS ( SELECT key, CAST( json_extract(from_utf8(from_base64(object_access_control_list)), '$.grants') AS ARRAY(MAP(VARCHAR, VARCHAR)) ) AS grants_array FROM your_table_name ) SELECT key, grants_array, grant FROM grants, UNNEST(grants_array) AS t(grant) WHERE element_at(grant, 'uri') = 'http://acs.amazonaws.com/groups/global/AllUsers'
    # Get the S3 keys that have Object ACL grantees in addition to the object owner. WITH grants AS (SELECT key, from_utf8(from_base64(object_access_control_list)) AS object_access_control_list, object_owner, CAST(json_extract(from_utf8(from_base64(object_access_control_list)), '$.grants') AS ARRAY(MAP(VARCHAR, VARCHAR))) AS grants_array FROM your_table_name) SELECT key, grant, objectowner FROM grants, UNNEST(grants_array) AS t(grant) WHERE cardinality(grants_array) > 1 AND element_at(grant, 'canonicalId') != object_owner;
    # Get the S3 keys with READ permission that is granted in the Object ACL. WITH grants AS ( SELECT key, CAST( json_extract(from_utf8(from_base64(object_access_control_list)), '$.grants') AS ARRAY(MAP(VARCHAR, VARCHAR)) ) AS grants_array FROM your_table_name ) SELECT key, grants_array, grant FROM grants, UNNEST(grants_array) AS t(grant) WHERE element_at(grant, 'permission') = 'READ';
    # Get the S3 keys that have Object ACL grants to a specific canonical user ID. WITH grants AS ( SELECT key, CAST( json_extract(from_utf8(from_base64(object_access_control_list)), '$.grants') AS ARRAY(MAP(VARCHAR, VARCHAR)) ) AS grants_array FROM your_table_name ) SELECT key, grants_array, grant FROM grants, UNNEST(grants_array) AS t(grant) WHERE element_at(grant, 'canonicalId') = 'user-canonical-id';
    # Get the number of grantees on the Object ACL. SELECT key, object_access_control_list, json_array_length(json_extract(object_access_control_list,'$.grants')) AS grants_count FROM your_table_name;

Untuk informasi selengkapnya tentang cara menggunakan Athena, lihat Panduan Pengguna Amazon Athena.