【Python】 -- python3 读取 aws athena 表数据

目录

1、环境准备

2、安装环境

[3、举例查询某张表数据和执行 add partition 操作](#3、举例查询某张表数据和执行 add partition 操作)

[3.1、编辑文件 athena_jdbc.py](#3.1、编辑文件 athena_jdbc.py)

[3.2、查找 JVM 的动态链接库路径](#3.2、查找 JVM 的动态链接库路径)

3.3、保存文件,执行以下命令

1、环境准备

  • oracle jdk 11
  • centos 8
  • 依赖:pandas、pyathenajdbc 和 sqlalchemy

2、安装环境

  • $ sudo pip install pandas -y
  • $ sudo pip install pyathenajdbc -y
  • $ sudo pip install sqlalchemy -y

3、举例查询某张表数据和执行 add partition 操作

3.1、编辑文件 athena_jdbc.py

python 复制代码
import time
from datetime import datetime
import pandas as pd
from pyathenajdbc import connect
from sqlalchemy import create_engine, text


# 配置 AWS Athena 的连接参数
aws_access_key_id = "your_aws_access_key_id"
aws_secret_access_key = "your_aws_secret_access_key"
aws_region = "your_region"
s3_output_location = "s3://your-test-bucket/athena_result/"
work_group = "primary"


"""
获取今天的日期并格式化为 YYYYMMDD 的字符串格式。

Returns:
    str: 格式化后的日期字符串。
"""
def get_formatted_date():
    today = datetime.today()
    formatted_date = today.strftime("%Y%m%d")
    return formatted_date



# 获取读取表数据的链接
conn = connect(User='aws_access_key_id',
               Password='aws_secret_access_key',
               S3OutputLocation='s3://your-test-bucket/athena_result',
               AwsRegion='your_region',
               jvm_path='/usr/lib/jvm/java-11/lib/server/libjvm.so')


# 获取执行 ddl 的链接
engine = create_engine(
    f"awsathena+rest://{aws_access_key_id}:{aws_secret_access_key}@athena.{aws_region}.amazonaws.com:443/"
    f"default?s3_staging_dir={s3_output_location}&work_group={work_group}"
)


"""
生成多张表的 athena 添加分区 SQL。

Args:
    today_time (str): 当前日期,格式为 'yyyyMMdd'。
    table_names (list): 表名列表。

Returns:
    list: 包含所有表的 athena SQL 语句的列表。
"""
def generate_athena_partition_sqls(data_date, table_names):
    sql_list = []
    for table_name in table_names:
        sql = (
            f"ALTER TABLE tg_bigdata.{table_name} "
            f"ADD IF NOT EXISTS PARTITION (data_date=\'{data_date}\') "
            f"LOCATION \'s3://your-test-bucket//ods/{table_name}/data_date={data_date}/\';"
        )
        sql_list.append(sql)
    
    return sql_list

print(f"------> Creating SQL...")
data_date = get_formatted_date()
table_names = ["ods_user_all", "ods_music_all"]
exec_sqls = generate_athena_partition_sqls(data_date, table_names)

print(f"------> Created SQL...")
print(f"------> Starting executing SQL...")
with engine.connect() as conn:
    for sql in exec_sqls:
        conn.execute(text(sql))
        print(f"Executed SQL: {sql}...")

print(f"------> Ended executing SQL...")

3.2、查找 JVM 的动态链接库路径

$ sudo find /usr/lib/jvm -name "libjvm.so"
修改 jvm_path 为查到到的地址。

3.3、保存文件,执行以下命令

注意:执行前,需要添加环境变量!

复制代码
export AWS_ACCESS_KEY_ID=your_aws_access_key_id
export AWS_SECRET_ACCESS_KEY=aws_secret_access_key
export AWS_DEFAULT_REGION=your_region
export AWS_ATHENA_S3_STAGING_DIR=s3://your-test-bucket/athena_result/jdbc

$ python3 athena_jdbc.py

相关推荐
笑衬人心。几秒前
Ubuntu 22.04 修改默认 Python 版本为 Python3 笔记
笔记·python·ubuntu
长征coder7 分钟前
AWS MySQL 读写分离配置指南
mysql·云计算·aws
蛋仔聊测试14 分钟前
Playwright 中 Page 对象的常用方法详解
python
醇醛酸醚酮酯22 分钟前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
前端付豪26 分钟前
17、自动化才是正义:用 Python 接管你的日常琐事
后端·python
jioulongzi27 分钟前
记录一次莫名奇妙的跨域502(badgateway)错误
开发语言·python
破无差1 小时前
python实现简单的地图绘制与标记20250705
python
向阳@向远方1 小时前
第二章 简单程序设计
开发语言·c++·算法
喜欢吃豆1 小时前
目前最火的agent方向-A2A快速实战构建(二): AutoGen模型集成指南:从OpenAI到本地部署的全场景LLM解决方案
后端·python·深度学习·flask·大模型
Mr_Xuhhh1 小时前
信号与槽的总结
java·开发语言·数据库·c++·qt·系统架构