Athena for Spark の既知の問題 - Amazon Athena

Athena for Spark の既知の問題

このページでは、Athena for Apache Spark に関する既知の問題についていくつか説明します。

テーブル作成時の不正な引数の例外

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 Management Console にサインインし、AWS Glue コンソール (https://console.aws.amazon.com/glue/) を開きます。

  2. ナビゲーションペインで、データベースを選択します。

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

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

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

  6. [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/')。

ワークグループの場所に作成されたデータベース

データベースを作成するために、spark.sql('create database db') などのコマンドを使用してデータベースの場所を指定しない場合、Athena はワークグループの場所にサブディレクトリを作成し、その場所を新しく作成されたデータベースに使用します。

AWS Glue デフォルトデータベースの Hive 管理対象テーブルに関する問題

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 のテーブルの場所が正しく表示されない場合があります。

  2. Athena for Spark では、DROP TABLE $table_name ステートメントを使用して作成したテーブルをドロップします。

  3. DROP TABLE ステートメントを実行すると、Amazon S3 下にあるファイルが依然として存在していることがわかります。

この問題を解決するには、次のいずれかを実行します。

解決策 A — Hive 管理対象テーブルを作成するときには、別の AWS Glue データベースを使用します。

解決策 B — AWS Glue のデフォルトデータベースに空の場所を指定します。次に、デフォルトのデータベースに管理対象テーブルを作成します。

Athena for Spark と Athena SQL 間の CSV ファイル形式と JSON ファイル形式の非互換性

オープンソースである 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 API 構文を使用する:

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

オープンソースである Spark には既知の問題があるため、結果テーブルに対して Athena SQL からクエリした場合に成功しない可能性があります。

推奨される解決策 — Apache Hive 構文を使用して Athena for Spark でテーブルを作成してみてください。詳細については、Apache Hive ドキュメントの「HIVEFORMAT テーブルを作成する」を参照してください。