如何解决无法使用Python从AWS Glue数据库/表中读取数据
我的要求是使用python脚本从AWS Glue数据库读取数据到数据框。当我研究时,我与图书馆-“ awswrangler”战斗。我正在使用以下代码连接和读取数据:
import awswrangler as wr
profile_name = 'aws_profile_dev'
REGION = 'us-east-1'
#Retreiving credentials to connect to AWS
ACCESS_KEY_ID,SECRET_ACCESS_KEY,SESSION_TOKEN = get_profile_credentials(profile_name)
session = boto3.session.Session(
aws_access_key_id=ACCESS_KEY_ID,aws_secret_access_key=SECRET_ACCESS_KEY,aws_session_token=SESSION_TOKEN
)
my_df= wr.athena.read_sql_table(table= 'mytable_1',database= 'shared_db',boto3_session=session)
但是,当我运行上述代码时,出现以下错误-“ ValueError:年份0超出范围”
或者,我尝试使用另一个库-“ pyathena”。我要使用的代码是:
from pyathena import connect
import pandas as pd
conn = connect(aws_access_key_id=ACCESS_KEY_ID,aws_session_token=SESSION_TOKEN,s3_staging_dir='s3://my-sample-bucket/',region_name='us-east-1')
df = pd.read_sql("select * from AwsDataCatalog.shared_db.mytable_1 limit 1000",conn)
使用此功能,我可以检索数据,但是仅当我使用限制时,它才有效。即,如果我只是在没有 limit 的情况下运行查询,即“从AwsDataCatalog.shared_db.mytable_1中选择*”,则会出现错误-ValueError:年份0超出范围
奇怪的行为-例如,如果我运行:
df = pd.read_sql("select * from AwsDataCatalog.shared_db.mytable_1 limit 1200",conn)
有时会给出相同的错误,如果我只是减小极限值并运行(例如,极限1199),后来再以1200极限运行时,它就会起作用。但是,如果我要读取的行数超过1300,这将无法正常工作。表中总共有2002行。我需要阅读整个表格。
请帮助!谢谢!
解决方法
在python中使用以下代码获取所需数据。
import boto3
query = "SELECT * from table_name"
s3_resource = boto3.resource("s3")
s3_client = boto3.client('s3')
DATABASE = 'database_name'
output='s3://output-bucket/output-folder'
athena_client = boto3.client('athena')
# Execution
response = athena_client.start_query_execution(
QueryString=query,QueryExecutionContext={
'Database': DATABASE
},ResultConfiguration={
'OutputLocation': output,}
)
queryId = response['QueryExecutionId']
,
我找到了一种使用awswrangler直接从Athena查询数据到本地计算机上的pandas数据框的方法。不需要我们在S3上提供输出位置。
profile_name = 'Dev-AWS'
REGION = 'us-east-1'
#this automatically retrieves credentials from your aws credentials file after you run aws configure on command-line
ACCESS_KEY_ID,SECRET_ACCESS_KEY,SESSION_TOKEN = get_profile_credentials(profile_name)
session = boto3.session.Session(
aws_access_key_id=ACCESS_KEY_ID,aws_secret_access_key=SECRET_ACCESS_KEY,aws_session_token=SESSION_TOKEN
)
wr.athena.read_sql_query("select * from table_name",database="db_name",boto3_session=session)
或者,如果您不想查询Athena,但想读取整个胶水表,则可以使用:
my_df = wr.athena.read_sql_table(table= 'my_table',database= 'my_db',boto3_session=session)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。