

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

# Pelajari tentang masalah yang diketahui di Athena untuk Spark
<a name="notebooks-spark-known-issues"></a>

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

## Pengecualian argumen ilegal saat membuat tabel
<a name="notebooks-spark-known-issues-illegal-argument-exception"></a>

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 Konsol Manajemen AWS dan buka AWS Glue konsol di [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/).

1. Di panel navigasi, pilih **Basis data**.

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

1. Pada halaman detail untuk database, pilih **Edit**.

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

1. 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 bernama`dbWithLocation`, 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 untuk`location`, seperti pada contoh berikut.

```
spark.sql("create table testTable (firstName STRING) 
       location 's3://amzn-s3-demo-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://amzn-s3-demo-bucket'")
```

Untuk memperbaikinya, tambahkan garis miring ke lokasi (misalnya,`'s3://amzn-s3-demo-bucket/'`).

## Database dibuat di lokasi workgroup
<a name="notebooks-spark-known-issues-database-created-in-a-workgroup-location"></a>

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
<a name="notebooks-spark-known-issues-managed-tables"></a>

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.

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

1. 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
<a name="notebooks-spark-known-issues-csv-and-json-file-format-incompatibility"></a>

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 [DataFrame](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/dataframe.html)API 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](https://spark.apache.org/docs/latest/sql-ref-syntax-ddl-create-table-hiveformat.html) Apache Spark. 