BioErrorLog Tech Blog

試行錯誤の記録

Athena経由でpandas DataFrameを作成する

Amazon Athena経由でpandas DataFrameを作成するやり方をまとめます。

はじめに

こんにちは、@bioerrorlogです。

Amazon Athenaクエリ経由でpandas DataFrameを作成したい、としたらどのようなやり方があるでしょうか。 

例えばいちばん愚直にやろうとすれば、boto3でAthenaクエリを発行し、クエリ結果からデータを取得して、上手いことpandasに読み込ませる...とかでしょうか。 そんな複雑なことやりたくないなぁと思って調べてみても、stackoverflowの上位answerでも似たような解決策が示されています。

しかしもう少し調べると、awswranglerを使えばかなりスッキリ書けることを知りました。

今回は、awswranglerを使ってAthena経由でpandas DataFrameを作成するやり方をメモします。


※追記:awswranglerはAWS SDK for pandasに改名されました(使い方は特に変わってない模様です)。

awswrangler (AWS SDK for pandas)とは

awswranglerは、AWSサービスとpandasを連携するツールです。

AWS公式(awslabs)が開発しており、Athenaだけでなく各AWSのDB系サービスとの連携もサポートしています。

Pandas on AWS. Easy integration with Athena, Glue, Redshift, Timestream, OpenSearch, Neptune, QuickSight, Chime, CloudWatchLogs, DynamoDB, EMR, SecretManager, PostgreSQL, MySQL, SQLServer and S3 (Parquet, CSV, JSON and EXCEL).

github.com

Athena経由でpandas DataFrameを作成する

このawswranglerを使えば、次のように簡単にAthenaのクエリ結果をそのままpandas DataFrameに読み込ませることができます。

import awswrangler as wr

df = wr.athena.read_sql_query(sql='SELECT * FROM "<table_name>"', database='<database_name>')

ちなみに上記のコードでは、Athena query resultの出力先を指定していません。 その場合はデフォルトでs3://aws-athena-query-results-ACCOUNT-REGION/にquery resultが出力されますが、任意のS3を指定したければs3_outputから指定することができます。

その他athena.read_sql_queryの各オプションはドキュメントをご覧ください

おわりに

今回は、awswranglerを使ってAthena経由でpandas DataFrameを作成するやり方をメモしました。

素のboto3で書くよりもずっとシンプルに書くことができるので、なかなか使い勝手が良いのではないでしょうか。 awslabs公式のツールであることも嬉しいポイントです。

以上、どなたかの参考になれば幸いです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

参考

GitHub - aws/aws-sdk-pandas: Pandas on AWS - Easy integration with Athena, Glue, Redshift, Timestream, Neptune, OpenSearch, QuickSight, Chime, CloudWatchLogs, DynamoDB, EMR, SecretManager, PostgreSQL, MySQL, SQLServer and S3 (Parquet, CSV, JSON and EXCEL).

Quick Start — AWS SDK for pandas 2.17.0 documentation

awswrangler.athena.read_sql_query — AWS SDK for pandas 2.17.0 documentation

python - How to Create Dataframe from AWS Athena using Boto3 get_query_results method - Stack Overflow