

# 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 では空のロケーションプロパティを使用して AWS Glue にデータベースを作成することはできませんが、Spark の外部で作成されたデータベースには、空の `LOCATION` プロパティを設定できます。

テーブルを作成し、空の `LOCATION` フィールドがを持つ AWS Glue データベースを指定すると、次の「IllegalArgumentException: Cannot create a path from an empty string」(IllegalArgumentException: 空の文字列からパスを作成することはできません) というような例外が発生する可能性があります。

例えば、次のコマンドは、AWS Glue のデフォルトデータベースに空の `LOCATION` フィールドが含まれている場合に例外をスローします。

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

**推奨される解決策 A** - AWS Glue を使用して、使用しているデータベースに場所を追加します。

**AWS Glue データベースに場所を追加するには**

1. AWS マネジメントコンソール にサインインし、AWS Glue コンソール ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)) を開きます。

1. ナビゲーションペインで、**[Databases]** (データベース) を選択します。

1. データベースのリストで、編集するデータベースを選択します。

1. データベースの詳細ページで、**[Edit]** (編集) を選択します。

1. **[Update a database]** (データベースの更新) ページの **[Location]** (場所) に Amazon S3 の場所を入力します。

1. **[Update Database]** (データベースの更新) を選択します。

**推奨される解決策 B** - Amazon S3 に既存の有効な場所がある別の AWS Glue データベースを使用します。例えば、`dbWithLocation` という名前のデータベースがある場合は、コマンド `spark.sql("use dbWithLocation")` を使用してそのデータベースに切り替えます。

**推奨される解決法 C** - Spark SQL を使用してテーブルを作成する場合、次の例のように `location` の値を指定します。

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

**推奨される解決策 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>

AWS Glue のデフォルトデータベースの `Location` プロパティが空でなく、Amazon S3 内の有効な場所を指定している場合、Athena for Spark を使用して AWS Glue デフォルトデータベースに Hive 管理対象テーブルを作成すると、データは AWS Glue データベースで指定された場所ではなく、Athena Spark ワークグループで指定された Amazon S3 がある場所に書き込まれます。

この問題は、Apache Hive がデフォルトデータベースを処理する方法に起因しています。Apache Hive は、Hive ウェアハウスのルートロケーションにテーブルデータを作成します。このルートロケーションは、実際のデフォルトのデータベースロケーションとは異なる場合があります。

Athena for Spark を使用して AWS Glue のデフォルトデータベース内に Hive 管理対象テーブルを作成すると、AWS Glue テーブルのメタデータが 2 つの異なる場所を指すことがあります。これにより、`INSERT` または `DROP TABLE` 操作を試みたときに、予期しない動作が発生する可能性があります。

問題を再現する手順は次のとおりです。

1. Athena for Spark では、次の方法のうちの 1 つを選択して、Hive 管理対象テーブルを作成または保存します。
   + `CREATE TABLE $tableName` などの SQL ステートメント
   + Dataframe API で `path` オプションを指定しない、`df.write.mode("overwrite").saveAsTable($tableName)` などの PySpark コマンド

   この時点で、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 Hive ドキュメントの「[HIVEFORMAT テーブルを作成する](https://spark.apache.org/docs/latest/sql-ref-syntax-ddl-create-table-hiveformat.html)」を参照してください。