使用 PyCharm 通过 JDBC 连接到 AWS Athena - fetchSize 问题

Posted

技术标签:

【中文标题】使用 PyCharm 通过 JDBC 连接到 AWS Athena - fetchSize 问题【英文标题】:Connecting to AWS Athena through JDBC with PyCharm - fetchSize issue 【发布时间】:2017-11-19 12:37:49 【问题描述】:

我已使用我的 PyCharm Pro 版本连接到 AWS Athena。 它连接成功,但每当我运行查询时,我都会得到:

请求的 fetchSize 大于 Athena 中的允许值。 请减小 fetchSize 并重试。参考雅典娜 有效 fetchSize 值的文档。

我已经从 AWS Athena JDBC documentation 下载了 Athena JDBC 驱动程序

可能是什么问题?

【问题讨论】:

【参考方案1】:

在获取大小、JDBC 和 AWS athena 方面需要考虑的一件事。似乎有一个semi-documented but well known limit of 1000 rows per fetch。我知道流行的PyAthenaJDBC library 将其设置为他们的default fetch size。所以,这可能是你问题的一部分。

当我尝试一次提取超过 1000 行时,我可能会产生提取大小错误。

from pyathenajdbc import connect 
conn = connect(s3_staging_dir='s3://SOMEBUCKET/', 
region_name='us-east-1')
cur = conn.cursor()
cur.execute('SELECT * FROM SOMEDATABASE.big_table LIMIT 5000')
results = cur.fetchall()
print len(results)
# Note: The cursor class actually has a setter method to 
#       keep users from setting illegal fetch sizes   
cur._arraysize = 1001 # Set array size one greater than the default
cur.execute('SELECT * FROM athena_test.big_table LIMIT 5000')
results = cur.fetchall() # Generate an error

java.sql.SQLExceptionPyRaisable: java.sql.SQLException: The requested fetchSize is more than the allowed value in Athena. Please reduce the fetchSize and try again. Refer to the Athena documentation for valid fetchSize values.

可能的解决方案包括:

    在 Web GUI 中运行查询,然后手动下载结果集 在您选择的编辑器/IDE(DataGrip、Athena Web GUI 等)中开发查询,并通过 Python SDK 将查询字符串传递给 Athena。然后,您可以等待查询完成并获取结果集。 您执行查询并对结果进行分页。 如果您从 Python 调用 SQL(我从 PyCharm 标记推断),您可以使用 PyAthenaJDBC 之类的库来为您处理页面大小(参见上面的示例)。

对于我的许多 Python 脚本,我使用类似于以下的工作流程。

import boto3
import time

sql = 'SELECT * from athena_test.big_table'

database = 'SOMEDATABASE'
bucket_name = 'SOMEBUCKET' 
output_path = '/home/zerodf/temp/somedata.csv'

client = boto3.client('athena')
config = 'OutputLocation': 's3://' + bucket_name + '/',
      'EncryptionConfiguration': 'EncryptionOption': 'SSE_S3'

execution_results = client.start_query_execution(QueryString = sql,
                                             QueryExecutionContext =
                                             'Database': database,
                                             ResultConfiguration = config)

execution_id = str(execution_results[u'QueryExecutionId'])
remote_file = execution_id + '.csv'

while True:
    query_execution_results = client.get_query_execution(QueryExecutionId =
                                                     execution_id)
    if query_execution_results['QueryExecution']['Status']['State'] == u'SUCCEEDED':
        break
    else:
        time.sleep(60)

s3 = boto3.resource('s3')
s3.Bucket(bucket_name).download_file(remote_file, output_path)

显然,生产代码更复杂。

【讨论】:

驱动的参数改不了怎么办? 根据您帖子的标签,我假设您是 Python 开发人员。如果要运行查询并下拉结果,可以使用上面提供的任一示例。为了开发复杂的查询,我通常会在 IDE 本身中将LIMIT 100 添加到我的查询末尾。这样一来,我就不必担心获取大量临时数据或降低 IDE 的速度。【参考方案2】:

我认为您应该在 DataGrip 的这个设置中设置适当的值

【讨论】:

以上是关于使用 PyCharm 通过 JDBC 连接到 AWS Athena - fetchSize 问题的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 JDBC 连接通过 SSH 隧道连接到 Azure DB

使用 JDBC 瘦客户端通过 SSL 连接到 Ignite 集群

无法使用 Zookeeper 连接字符串通过 JDBC 连接到 Hive

无法通过 jdbc 连接到 hive

使用 DataSource 通过 (Xerial) sqlite-jdbc 驱动程序连接到 SQLite

无法使用 jdbc 通过 Hive 连接到 HBase