

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 了解 Athena for Spark 中的已知問題
<a name="notebooks-spark-known-issues"></a>

本頁說明了 Athena for Apache Spark 中的一些已知問題。

## 建立資料表時的非法引數例外狀況
<a name="notebooks-spark-known-issues-illegal-argument-exception"></a>

雖然 Spark 不允許使用空的位置屬性建立資料庫，但如果在 Spark 外部建立資料庫，則 中的資料庫 AWS Glue 可以有空`LOCATION`屬性。

如果您建立資料表並指定具有空白`LOCATION`欄位的 AWS Glue 資料庫，可能會發生類似下列的例外狀況：IllegalArgumentException：無法從空白字串建立路徑。

例如，如果 AWS Glue 中的預設資料庫包含空 `LOCATION` 欄位，則下列命令會擲出例外狀況：

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

**建議的解決方案 A** – 使用 AWS Glue 將位置新增至您正在使用的資料庫。

**將位置新增至 AWS Glue 資料庫**

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) 開啟 AWS Glue 主控台。

1. 在導覽窗格中，選擇 **Databases** (資料庫)。

1. 在資料庫清單中，選擇您要編輯的資料庫。

1. 在資料庫的詳細資訊頁面上，選擇 **Edit** (編輯)。

1. 在 **Update a database** (更新資料庫) 頁面上，針對 **Location** (位置)，輸入 Amazon S3 位置。

1. 選擇 **Update Database** (更新資料庫)。

**Suggested solution B** (建議的解決方案 B) – 使用在 Amazon S3 中具有現有有效位置的不同 AWS Glue 資料庫。例如，如果您有名為 `dbWithLocation` 的資料庫，請使用命令 `spark.sql("use dbWithLocation")` 切換至該資料庫。

**Suggested solution C** (建議的解決方案 C) – 當您使用 Spark SQL 建立資料表時，請指定 `location` 的值，如下列範例所示。

```
spark.sql("create table testTable (firstName STRING) 
       location 's3://amzn-s3-demo-bucket/'").
```

**Suggested solution D** (建議的解決放哪 D) – 如果您在建立資料表時指定了位置，但仍然發生該問題，則請確定您提供的 Amazon S3 路徑具有尾隨正斜線。例如，下列命令會擲出非法引數例外狀況：

```
spark.sql("create table testTable (firstName STRING) 
       location 's3://amzn-s3-demo-bucket'")
```

若要更正此問題，請在位置新增尾隨斜線 (例如，`'s3://amzn-s3-demo-bucket/'`)。

## 在工作群組位置中建立的資料庫
<a name="notebooks-spark-known-issues-database-created-in-a-workgroup-location"></a>

如果您使用類似 `spark.sql('create database db')` 的命令建立資料庫，但未指定資料庫的位置，則 Athena 會在您的工作群組位置中建立子目錄，並將該位置用於新建立的資料庫。

## AWS Glue 預設資料庫中 Hive 受管資料表的問題
<a name="notebooks-spark-known-issues-managed-tables"></a>

如果在 中預設資料庫的 `Location` 屬性 AWS Glue 是非空的，並指定 Amazon S3 中的有效位置，而且您使用 Athena for Spark 在 AWS Glue 預設資料庫中建立 Hive 受管資料表，則資料會寫入 Athena Spark 工作群組中指定的 Amazon S3 位置，而不是 AWS Glue 資料庫指定的位置。

因為 Apache Hive 如何處理其預設資料庫，就會發生這個問題。Apache Hive 在 Hive 倉庫根位置中建立資料表，該位置可能與實際的預設資料庫位置不同。

當您使用 Athena for Spark 在預設資料庫下建立 Hive 受管資料表時 AWS Glue， AWS Glue 資料表中繼資料可以指向兩個不同的位置。當您嘗試 `INSERT` 或 `DROP TABLE` 作業時，這可能會導致非預期的行為。

重現問題的步驟如下：

1. 在 Athena for Spark 中，您可以使用下列其中一種方法來建立或儲存 Hive 管理的資料表：
   + 一個 SQL 陳述式 `CREATE TABLE $tableName`
   + 像 `df.write.mode("overwrite").saveAsTable($tableName)` 這樣的 PySpark 命令不會在 Dataframe API 中指定 `path` 選項。

   此時， AWS Glue 主控台可能會在 Amazon S3 中顯示資料表的不正確位置。

1. 在 Athena for Spark 中，您可以使用 `DROP TABLE $table_name` 陳述式刪除您所建立的資料表。

1. 執行 `DROP TABLE` 陳述式之後，您會注意到 Amazon S3 中的基礎檔案仍然存在。

要解決此問題，請執行下列項目之一：

**解決方案 A** – 建立 Hive 受管資料表時使用不同的 AWS Glue 資料庫。

**解決方案 B** – 在 AWS Glue中指定預設資料庫的空白位置。然後，在預設資料庫中建立受管理的資料表。

## Athena for Spark 和 Athena SQL 之間的 CSV 和 JSON 檔案格式不相容
<a name="notebooks-spark-known-issues-csv-and-json-file-format-incompatibility"></a>

由於開放原始碼 Spark 的已知問題，當您在 Athena for Spark 中就 CSV 或 JSON 資料建立資料表時，該資料表可能無法從 Athena SQL 讀取，反之亦然。

例如，您可使用下列其中一種方式在 Athena for Spark 中建立資料表：
+ 使用下列 `USING csv` 語法：

  ```
  spark.sql('''CREATE EXTERNAL TABLE $tableName ( 
  $colName1 $colType1, 
  $colName2 $colType2, 
  $colName3 $colType3) 
  USING csv 
  PARTITIONED BY ($colName1) 
  LOCATION $s3_location''')
  ```
+  使用下列 [DataFrame](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/dataframe.html) API 語法：

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

由於開放原始碼 Spark 的已知問題，Athena SQL 對結果資料表的查詢可能無法成功。

**建議的解決方案** – 嘗試使用 Apache Hive 語法在 Athena for Spark 中建立資料表。如需詳細資訊，請參閱 Apache Spark 文件中的[建立 HIVEFORMAT 資料表](https://spark.apache.org/docs/latest/sql-ref-syntax-ddl-create-table-hiveformat.html)。