读取sql数据写到csv档上传到minio,用airflow定时调度任务

from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.providers.amazon.aws.hooks.s3 import S3Hook
from airflow.providers.postgres.hooks.postgres import PostgresHook
from airflow.utils.dates import days_ago
from airflow.exceptions import AirflowException
import tempfile
import pandas as pd

# 读取sql数据并存为csv档上传到minio
def get_data(s3_conn_id, bucket_name, object_key_prefix, pg_conn_id, sql, **context):
    year, month, day, hour, *_ = context['execution_date'].timetuple()
    # 创建 postgres数据路连接引擎
    pg_hook = PostgresHook(postgres_conn_id=pg_conn_id)
    # 获取sqlalchemy 引擎实例
    sqlalchemy_engine = pg_hook.get_sqlalchemy_engine()
    try:
        #read_sql方法读取数据库数据到DataFrame
        df = pd.read_sql(sql, sqlalchemy_engine)
        print(df.info())
        print(df.head())
    except Exception as e:
        raise AirflowException(f"read table to dataframe fail:{e}")
    # 将数据写到csv档并上传到s3服务器(minio)
    with tempfile.NamedTemporaryFile('wb+') as fp:
        temp_filename = fp.name  # 暫存檔案名
        # 上传csv档的key
        object_key = (
            f"{object_key_prefix}/task09/"
            f"{year}/{year}-{month:0>2}/"
            f"payment-{year}{month:0>2}{day:0>2}.csv.gz"
        )
        try:
            # export dataframe to csv
            df.to_csv(temp_filename, index=False, compression='gzip')
            # upload to minio
            s3_hook = S3Hook(aws_conn_id=s3_conn_id)
            s3_hook.load_file(filename=temp_filename,
                              bucket_name=bucket_name,
                              key=object_key,
                              replace=True)
            print(f'put query data to s3: [{bucket_name}] -> {object_key}, success!')
        except Exception as e:
            raise AirflowException(f"put query data to s3 fail:{e}")


default_args = {
    'owner':'airflow的dag账号', # owner是airflow的DAG的開發者
}

dag = DAG(
    dag_id="de13_task09", # prefix必需是tenant id
    description="dag to read dvdrental database to s3",
    start_date=days_ago(1),
    schedule_interval="0 0 * * *",   #airflow运行job的schedule(每天凌晨自动运行)
    catchup=False,      #false:不获取过去时间点的数据
    max_active_runs=1,
    default_args=default_args,
    access_control={
        'de13': {'can_read', 'can_edit'} # 設定DAG歸屬那個團隊[tenant id]與權限
    },
    tags=['de08'],
)

#执行sql语句
sql_stmt = """
SELECT
first_name || ' ' || last_name full_name, SUM (amount) amount
FROM
payment INNER JOIN customer USING (customer_id)    
GROUP BY full_name ORDER BY amount;
"""

# airflow相关设定
task_get_data = PythonOperator(
    task_id='get_data',
    python_callable=get_data,   #执行的方法
    #airflow上有关minio和postgre数据库的连线设定资讯
    op_kwargs={
        's3_conn_id': 'de13_minio',
        'bucket_name': 'minio的bucket名字',
        'object_key_prefix': 'de08/dvdrental',
        'pg_conn_id': 'airflow上数据库的连接资讯账号',
        'sql': sql_stmt,
    },
    dag=dag,
)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将本地数据迁移到MinIO并使用MinIO客户端进行操作,您可以按照以下步骤进行操作: 1. 安装MinIO客户端:首先,您需要在本地计算机上安装MinIO客户端。您可以从MinIO的官方网站下载适用于您操作系统的MinIO客户端,并按照安装说明进行安装。 2. 配置MinIO客户端:在安装完成后,您需要配置MinIO客户端以连接到MinIO服务器。使用以下命令配置MinIO客户端: ``` mc config host add <别名> <MinIO服务器地址> <访问密钥> <秘密密钥> ``` 其中,`<别名>`是您为MinIO服务器设置的别名,`<MinIO服务器地址>`是MinIO服务器的URL,`<访问密钥>`和`<秘密密钥>`是用于访问MinIO服务器的凭据。 3. 创建存储桶:在迁移数据之前,您需要在MinIO服务器上创建一个存储桶来存储数据。使用以下命令创建存储桶: ``` mc mb <别名>/<存储桶名称> ``` 其中,`<别名>`是您在配置MinIO客户端时设置的别名,`<存储桶名称>`是您要创建的存储桶的名称。 4. 迁移数据:一旦配置和准备工作完成,您可以使用MinIO客户端将本地数据迁移到MinIO服务器。使用以下命令将本地文件夹中的数据迁移到MinIO服务器的存储桶中: ``` mc cp <本地文件夹路径> <别名>/<存储桶名称> ``` 其中,`<本地文件夹路径>`是您要迁移的本地文件夹的路径,`<别名>`是您在配置MinIO客户端时设置的别名,`<存储桶名称>`是您要将数据迁移到的MinIO存储桶的名称。 以上是将本地数据迁移到MinIO并使用MinIO客户端进行操作的基本步骤。如果您有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值