13

プロジェクトの 1 つのデータベース ストレージとして aurora サーバーレスを検討しています。aurora サーバーレス クラスタからイベントをフェッチするために POC を実行しているときに、「データベースが許可された応答サイズの制限を超えて返されました」という例外を受け取ります。

  1. これに対する組み込みソリューションはありますか? aurora サーバーレスに dynamoDB に似たトークン メカニズムはありますか?
  2. 50,000 をすばやく取得することは、重要な要件の 1 つです。aurora または aurora サーバーレスを使用する必要がありますか?

データベースの詳細: Aurora PostgreSQL サーバーレス。

POC を行うために、これらの制限があるデータ API を使用しています。

import boto3;

client = boto3.client('rds-data')

import sys;
sql_statement = "select * from table_name limit 1000"

response = client.execute_statement(  
    database='mydb',  
    secretArn='<secret_arn',  
    resourceArn='<resource_arn>',  
    sql=sql_statement  
) 

print(response);
4

3 に答える 3

0

何らかの理由で、pandas read_sql の「chunksize」引数は AWS Data API でうまく機能しません。ところで、MySQL を使用していますが、pydataapi は両方をサポートする必要があります。

この問題に対して私が見つけた解決策は、pandas のread_sqlと文字列形式の LIMIT を使用してデータベースを繰り返しクエリすることです。これはpydataapi python パッケージを使用します。

最初に構文を使用してテーブルの長さを取得しました

df_status = pd.read_sql('show table status like "yourtable";', con = sql_engine)

次に、numpy.arange() を使用して、リクエストの開始行を決定します。各クエリは、ここで「chunksize」パラメーターで指定された行数を要求します。私は 20,000 を選択しましたが、応答が 1MB を超えない最大値を選択する必要があります。

次に、データフレームのリストを連結するだけです。これが今のところ最適なソリューションであることがわかりました。

    import pandas as pd
    import numpy as np
    import boto3
    from sqlalchemy import create_engine

    cluster_arn = 'yourcluster'
    secret_arn = 'yoursecret'
    database = 'mydb'
    chunksize = 20000


    rdsData = boto3.client('rds-data', region_name = 'yourregion')
    sql_engine = create_engine('mysql+pydataapi://',
                               connect_args = {
                                   'resource_arn': cluster_arn,
                                   'secret_arn': secret_arn,
                                   'database': database,
                                   'client': rdsData}).connect()
    df_status = pd.read_sql("show table status like 'yourtable';", con = sql_engine)
    rownum = df_status.loc[0, "Rows"]
    space = np.arange(0, rownum, chunksize)
    space = space.tolist()
    space.append(rownum)
    df_list = []
    for i in space:
        df = pd.read_sql("select * from yourtable LIMIT {}, {}".format(i, chunksize), con = sql_engine)
        df_list.append(df)
    big_df = pd.concat(df_list)
    sql_engine.close()
于 2020-12-15T22:45:36.570 に答える