Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menangani pembaruan skema
Bagian ini menyediakan panduan tentang penanganan pembaruan skema untuk berbagai format data. Athena adalah mesin schema-on-read kueri. Ini berarti bahwa saat Anda membuat tabel di Athena, itu berlaku skema saat membaca data. Itu tidak mengubah atau menulis ulang data yang mendasari.
Jika Anda mengantisipasi perubahan dalam skema tabel, pertimbangkan untuk membuat mereka dalam format data yang cocok untuk kebutuhan Anda. Tujuan Anda adalah untuk menggunakan kembali pertanyaan Athena yang ada terhadap skema yang berkembang, dan menghindari kesalahan ketidakcocokan skema saat kueri tabel dengan partisi.
Untuk mencapai tujuan ini, pilih format data tabel berdasarkan tabel dalam topik berikut.
Topik
Operasi pembaruan skema yang didukung oleh format data
Tabel berikut merangkum format penyimpanan data dan manipulasi skema mereka didukung. Gunakan tabel ini untuk membantu Anda memilih format yang akan memungkinkan Anda untuk terus menggunakan Athena kueri bahkan saat skema Anda berubah dari waktu ke waktu.
Dalam tabel ini, amati itu Parket dan ORC format kolumnar dengan metode akses kolom default yang berbeda. Secara default, Parket akan mengakses kolom berdasarkan nama dan ORC indeks (nilai ordinal). Oleh karena itu, Athena menyediakan SerDe properti yang didefinisikan saat membuat tabel untuk beralih metode akses kolom default yang memungkinkan fleksibilitas yang lebih besar dengan evolusi skema.
Untuk Parket, parquet.column.index.access
properti dapat diatur ketrue
, yang menetapkan metode akses kolom untuk menggunakan nomor urut kolom. Menetapkan properti ini kefalse
akan mengubah metode akses kolom untuk menggunakan nama kolom. Demikian pula, untuk ORC menggunakan orc.column.index.access
properti untuk mengontrol metode akses kolom. Untuk informasi selengkapnya, lihat Memahami akses indeks untuk Apache ORC dan Apache Parquet.
CSVdan TSV memungkinkan Anda untuk melakukan semua manipulasi skema kecuali menyusun ulang kolom, atau menambahkan kolom di awal tabel. Misalnya, jika evolusi skema Anda hanya memerlukan penggantian nama kolom tetapi tidak menghapusnya, Anda dapat memilih untuk membuat tabel di CSV atau. TSV Jika Anda perlu menghapus kolom, jangan gunakan CSV atauTSV, dan sebagai gantinya gunakan salah satu format lain yang didukung, sebaiknya, format kolom, seperti Parket atau. ORC
Jenis pembaruan skema yang diharapkan | Ringkasan | CSV(dengan dan tanpa header) dan TSV | JSON | AVRO | PARQUET: Baca dengan nama (default) | PARQUET: Baca dengan indeks | ORC: Dibaca berdasarkan indeks (default) | ORC: Baca dengan nama |
---|---|---|---|---|---|---|---|---|
Ganti nama kolom | Simpan data Anda di CSV danTSV, atau di dalam ORC dan Parket jika dibaca berdasarkan indeks. | T | T | T | T | T | T | T |
Tambahkan kolom di awal atau di tengah tabel | Simpan data Anda diJSON,AVRO, atau di Parket dan ORC jika dibaca dengan nama. Jangan gunakan CSV danTSV. | T | T | Y | T | T | T | T |
Tambahkan kolom di akhir tabel | Simpan data Anda di CSV atauTSV,JSON, AVROORC, atau Parket. | T | Y | Y | Y | Y | Y | T |
Hapus kolom | Simpan data Anda diJSON,AVRO, atau Parket danORC, jika dibaca dengan nama. Jangan gunakan CSV danTSV. | T | T | Y | T | T | T | T |
Susun ulang kolom | Simpan data Anda diAVRO, JSON atau ORC dan Parket jika dibaca dengan nama. | T | T | Y | T | T | T | T |
Mengubah tipe data kolom | Simpan data Anda dalam format apa pun, tetapi uji kueri Anda di Athena untuk memastikan jenis data kompatibel. Untuk Parket danORC, mengubah tipe data hanya berfungsi untuk tabel yang dipartisi. | T | Y | Y | Y | Y | Y | T |
Memahami akses indeks untuk Apache ORC dan Apache Parquet
PARQUETdan ORC merupakan format penyimpanan data kolumnar yang dapat dibaca berdasarkan indeks, atau dengan nama. Menyimpan data Anda dalam salah satu format ini memungkinkan Anda melakukan semua operasi pada skema dan menjalankan kueri Athena tanpa kesalahan skema ketidakcocokan.
-
Athena membaca ORC berdasarkan indeks secara default, seperti yang didefinisikan dalam.
SERDEPROPERTIES ( 'orc.column.index.access'='true')
Untuk informasi selengkapnya, lihat ORC: Baca dengan indeks. -
Athena membacaParket dengan nama secara lalai, sebagaimana didefinisikan dalam
SERDEPROPERTIES ( 'parquet.column.index.access'='false')
. Untuk informasi selengkapnya, lihat Parket: Baca dengan nama.
Karena ini adalah default, menentukan SerDe properti ini dalam CREATE
TABLE
kueri Anda adalah opsional, mereka digunakan secara implisit. Saat digunakan, mereka memungkinkan Anda untuk menjalankan beberapa operasi update skema sementara mencegah operasi seperti lainnya. Untuk mengaktifkan operasi tersebut, jalankan CREATE TABLE
kueri lain dan ubah SerDe pengaturan.
catatan
SerDe Properti tidak secara otomatis disebarkan ke setiap partisi. Gunakan ALTER TABLE ADD PARTITION
pernyataan untuk mengatur SerDe properti untuk setiap partisi. Untuk mengotomatiskan proses ini, menulis script yang berjalanALTER TABLE ADD PARTITION
.
Bagian berikut akan menjelaskan kasus ini secara terperinci.
ORC: Baca dengan indeks
Sebuah tabel di ORCdibaca oleh indeks, secara default. Ini didefinisikan oleh sintaks berikut:
WITH SERDEPROPERTIES ( 'orc.column.index.access'='true')
Membaca berdasarkan indeksmemungkinkan Anda untuk mengubah nama kolom. Tapi kemudian Anda kehilangan kemampuan untuk menghapus kolom atau menambahkannya di tengah tabel.
Untuk membuat ORC dibaca berdasarkan nama, yang akan memungkinkan Anda untuk menambahkan kolom di tengah tabel atau menghapus kolomORC, atur SerDe properti orc.column.index.access
ke false
dalam CREATE
TABLE
pernyataan. Dalam konfigurasi ini, Anda akan kehilangan kemampuan untuk mengubah nama kolom.
catatan
Di mesin Athena versi 2, ketika ORC tabel diatur untuk dibaca berdasarkan nama, Athena mengharuskan semua nama kolom dalam ORC file dalam huruf kecil. Karena Apache Spark tidak menggunakan nama bidang huruf kecil saat menghasilkan fileORC, Athena mungkin tidak dapat membaca data yang dihasilkan. Solusinya adalah mengganti nama kolom menjadi huruf kecil, atau menggunakan mesin Athena versi 3.
Contoh berikut menggambarkan bagaimana mengubah ORC untuk membuatnya dibaca dengan nama:
CREATE EXTERNAL TABLE orders_orc_read_by_name ( `o_comment` string, `o_orderkey` int, `o_custkey` int, `o_orderpriority` string, `o_orderstatus` string, `o_clerk` string, `o_shippriority` int, `o_orderdate` string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
WITH SERDEPROPERTIES ( 'orc.column.index.access'='false')
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/orders_orc/';
Parket: Baca dengan nama
Tabel diParket dibaca dengan namaSecara default. Ini didefinisikan oleh sintaks berikut:
WITH SERDEPROPERTIES ( 'parquet.column.index.access'='false')
Membaca dengan namamemungkinkan Anda untuk menambahkan kolom di tengah tabel dan menghapus kolom. Tapi kemudian Anda kehilangan kemampuan untuk mengganti nama kolom.
Untuk membuat Parket dibaca oleh indeks, yang akan memungkinkan Anda untuk mengganti nama kolom, Anda harus membuat tabel dengan parquet.column.index.access
SerDe properti diatur ke. true