Masalah yang diketahui di Athena untuk Spark - Amazon Athena

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

Masalah yang diketahui di Athena untuk Spark

Halaman ini mendokumentasikan beberapa masalah yang diketahui di Athena untuk Apache Spark.

Pengecualian argumen ilegal saat membuat tabel

Meskipun Spark tidak mengizinkan database dibuat dengan properti lokasi kosong, database di AWS Glue dapat memiliki LOCATION properti kosong jika dibuat di luar Spark.

Jika Anda membuat tabel dan menentukan AWS Glue database yang memiliki LOCATION bidang kosong, pengecualian seperti berikut dapat terjadi: IllegalArgumentException: Tidak dapat membuat jalur dari string kosong.

Misalnya, perintah berikut melempar pengecualian jika database default di AWS Glue berisi LOCATION bidang kosong:

spark.sql("create table testTable (firstName STRING)")

Solusi yang disarankan A — Gunakan AWS Glue untuk menambahkan lokasi ke database yang Anda gunakan.

Untuk menambahkan lokasi ke AWS Glue database
  1. Masuk ke AWS Management Console dan buka AWS Glue konsol di https://console.aws.amazon.com/glue/.

  2. Di panel navigasi, pilih Basis data.

  3. Dalam daftar database, pilih database yang ingin Anda edit.

  4. Pada halaman detail untuk database, pilih Edit.

  5. Pada halaman Perbarui database, untuk Lokasi, masukkan lokasi Amazon S3.

  6. Pilih Perbarui Database.

Solusi yang disarankan B — Gunakan AWS Glue database berbeda yang memiliki lokasi yang sudah ada dan valid di Amazon S3. Misalnya, jika Anda memiliki database bernamadbWithLocation, gunakan perintah spark.sql("use dbWithLocation") untuk beralih ke database itu.

Solusi yang disarankan C - Bila Anda menggunakan Spark SQL untuk membuat tabel, tentukan nilai untuklocation, seperti pada contoh berikut.

spark.sql("create table testTable (firstName STRING) location 's3://DOC-EXAMPLE-BUCKET/'").

Solusi yang disarankan D — Jika Anda menentukan lokasi saat membuat tabel, tetapi masalah masih terjadi, pastikan jalur Amazon S3 yang Anda berikan memiliki garis miring ke depan. Misalnya, perintah berikut melempar pengecualian argumen ilegal:

spark.sql("create table testTable (firstName STRING) location 's3://DOC-EXAMPLE-BUCKET'")

Untuk memperbaikinya, tambahkan garis miring ke lokasi (misalnya,'s3:// DOC-EXAMPLE-BUCKET/').

Database dibuat di lokasi workgroup

Jika Anda menggunakan perintah seperti spark.sql('create database db') membuat database dan tidak menentukan lokasi untuk database, Athena membuat subdirektori di lokasi workgroup Anda dan menggunakan lokasi tersebut untuk database yang baru dibuat.

Masalah dengan tabel terkelola Hive di database AWS Glue default

Jika Location properti database default Anda tidak kosong dan menentukan lokasi yang valid di AWS Glue Amazon S3, dan Anda menggunakan Athena for Spark untuk membuat tabel terkelola Hive di database default AWS Glue Anda, data akan ditulis ke lokasi Amazon S3 yang ditentukan dalam workgroup Athena Spark, bukan ke lokasi yang ditentukan oleh database. AWS Glue

Masalah ini terjadi karena bagaimana Apache Hive menangani basis data defaultnya. Apache Hive membuat data tabel di lokasi root gudang Hive, yang dapat berbeda dari lokasi database default yang sebenarnya.

Bila Anda menggunakan Athena for Spark untuk membuat tabel terkelola Hive di bawah database default AWS Glue, metadata AWS Glue tabel dapat menunjuk ke dua lokasi yang berbeda. Hal ini dapat menyebabkan perilaku yang tidak terduga ketika Anda mencoba INSERT atau DROP TABLE operasi.

Langkah-langkah untuk mereproduksi masalah adalah sebagai berikut:

  1. Di Athena for Spark, Anda menggunakan salah satu metode berikut untuk membuat atau menyimpan tabel terkelola Hive:

    • Pernyataan SQL seperti CREATE TABLE $tableName

    • PySpark Perintah seperti df.write.mode("overwrite").saveAsTable($tableName) itu tidak menentukan path opsi di Dataframe API.

    Pada titik ini, AWS Glue konsol mungkin menunjukkan lokasi yang salah di Amazon S3 untuk tabel.

  2. Di Athena for Spark, Anda menggunakan DROP TABLE $table_name pernyataan untuk menjatuhkan tabel yang Anda buat.

  3. Setelah Anda menjalankan DROP TABLE pernyataan, Anda melihat bahwa file yang mendasari di Amazon S3 masih ada.

Untuk mengatasi masalah ini, lakukan salah satu hal berikut:

Solusi A — Gunakan AWS Glue database yang berbeda saat Anda membuat tabel terkelola Hive.

Solusi B - Tentukan lokasi kosong untuk database default di AWS Glue. Kemudian, buat tabel terkelola Anda di database default.

Ketidakcocokan format file CSV dan JSON antara Athena untuk Spark dan Athena SQL

Karena masalah yang diketahui dengan Spark open source, saat Anda membuat tabel di Athena untuk Spark pada data CSV atau JSON, tabel mungkin tidak dapat dibaca dari Athena SQL, dan sebaliknya.

Misalnya, Anda dapat membuat tabel di Athena untuk Spark dengan salah satu cara berikut:

  • Dengan USING csv sintaks berikut:

    spark.sql('''CREATE EXTERNAL TABLE $tableName ( $colName1 $colType1, $colName2 $colType2, $colName3 $colType3) USING csv PARTITIONED BY ($colName1) LOCATION $s3_location''')
  • Dengan sintaks DataFrameAPI berikut:

    df.write.format('csv').saveAsTable($table_name)

Karena masalah yang diketahui dengan Spark open source, kueri dari Athena SQL pada tabel yang dihasilkan mungkin tidak berhasil.

Solusi yang disarankan - Coba buat tabel di Athena untuk Spark menggunakan sintaks Apache Hive. Untuk informasi selengkapnya, lihat MEMBUAT TABEL HIVEFORMAT di dokumentasi Apache Spark.