13

我们正在探索 aurora serverless 作为我们项目之一的数据库存储。在执行 POC 以从极光无服务器集群获取事件时,我们收到“数据库返回超过允许的响应大小限制”异常。

  1. 有没有内置的解决方案?aurora serverless 中是否有类似 dynamoDB 的 token 机制?
  2. 快速获取 50,000 是我们的关键要求之一。我们应该使用 aurora 还是 aurora serverless?

有关数据库的更多详细信息:Aurora PostgreSQL server less。

为了进行 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

9

当您通过数据 API 在任何 Aurora Serverless 实例中执行查询时,您有两个大小限制:

  1. 每个返回的行不能大于 64 KB;(来源
  2. 结果集不能大于 1 MB。(来源

目前,Data API 中没有解决这些限制的解决方案。在Amazon Aurora User Guide中,第 164 页中的第二个问题有一个推荐的解决方案:

在这种情况下,数据库返回的结果集的大小太大了。数据库返回的结果集中的数据 API 限制为 1 MB。要解决此问题,请确保对数据 API 的调用返回 1 MB 或更少的数据。如果您需要返回超过 1 MB 的数据,您可以在查询中使用多个带有 LIMIT 子句的 ExecuteStatement 调用。

考虑到这一点,您可以进行指数退避,直到为您的结果集找到一个可接受的 LIMIT,或者设置一个固定的 LIMIT,让您觉得它始终低于 1 MB,即使您的行大小将来会增加。

在定义了如何设置 LIMIT 子句值之后(取决于您的集群是使用MySQL 5.6MySQL 5.7还是PostgreSQL 10.7),您可以执行 COUNT 查询以了解您将获得多少结果,然后迭代直到执行COUNT / LIMIT语句。另一种选择是迭代,直到您的语句响应的行数少于您的 LIMIT。

于 2020-07-15T17:59:37.860 回答
0

https://github.com/cloud-utils/aurora-data-api处理这个问题

使用库获取所有查询的快速示例

with aurora_data_api.connect(aurora_cluster_arn=cluster_arn, secret_arn=secret_arn, database="cool_db_name_here") as conn:
    with conn.cursor() as cursor:
        cursor.execute("select * from cool_table")
        data = cursor.fetchall()
于 2021-07-28T15:22:57.640 回答
0

出于某种原因,pandas read_sql 的“chunksize”参数不能很好地与 AWS 数据 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 回答