Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >如何动态创建具有不同参数的运算符

如何动态创建具有不同参数的运算符
EN

Stack Overflow用户
提问于 2018-10-11 01:12:17
回答 2查看 488关注 0票数 1

我有以下代码:

代码语言:javascript
代码运行次数:0
复制
def chunck_import(**kwargs):
    ...
    logging.info('Number of pages required is: {0}'.format(num_pages))
    for i in range(1, num_pages + 1):
        ...
        parameter_where = 'where orders_id between {0} and {1}'.format(start,end)
        logging.info(parameter_where)

chunck_import_op = PythonOperator(
    task_id='chunck_import',
    provide_context=True,
    python_callable=chunck_import,
    dag=dag)


start_task_op >> ... >>  chunck_import_op

此操作符创建多个WHERE语句:

代码语言:javascript
代码运行次数:0
复制
INFO - From 7557920 to 7793493
INFO - Number of pages required is: 4
where orders_id between 7607920 and 7657920
where orders_id between 7657921 and 7707920
where orders_id between 7707921 and 7757920
where orders_id between 7757921 and 7793493

现在我有一个MySqlToGoogleCloudStorageOperator,如下所示:

代码语言:javascript
代码运行次数:0
复制
import_orders_op = MySqlToGoogleCloudStorageOperator(
    task_id='import_orders',
    ...
    sql = 'select * from orders {{ params.where_cluster }}',
    params={'where_cluster': parameter_where},
    dag=dag) 

chunck_import_op知道我需要调用MySqlToGoogleCloudStorageOperator - num_pages的次数,它还创建了需要作为参数- parameter_where传递的字符串。

我的问题是如何根据MySqlToGoogleCloudStorageOperator动态创建num_pages并将parameter_where传递给它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-11 19:47:09

我将子类MySqlToGoogleCloudStorageOperator自定义查询,并覆盖执行步骤,以根据传递给操作符的页面大小参数生成分页查询。这是一些额外的工作,但建议在这里的其他选项。

但是,您不能使用PythonOperator或任何运算符来修改DAG (并对其进行识别和调度)。它所能做的最多就是:

  1. 构建where子句之后,使用该子句构造一个MySqlToGoogleCloudStorageOperator,并在PythonOperator中对其调用execute。这将有效,您将在MySqlToGoogleCloudStorageOperator的日志中看到来自PythonOperator的日志消息。
  2. 使用PythonOperatorTriggerDagRunOperator触发另一个DAG,其中只有MySqlToGoogleCloudStorageOperator将子句作为参数传递,或者首先将其推送给XCOM。其他DAG可能会将计划设置为@None。这将使日志的后续工作更加困难,但它可以并行运行DAG。

如果是我的DAG,我认为我的方法(如果不是子类化的话)总是在1到X页中处理。让我们建议您的DAG应该处理最多X页的结果,其中X是10,例如。然后从chunck_import_op的父级定义10个分支。您不需要chunck_import_op或可调用的分支。

  • 每个分支将以一个ShortCircuitOperator开始,它使用不同的offset参数(0到9)调用相同的可调用函数。此可调用将检查offset * page_size是否大于end,如果是,则返回False,跳过下游运算符。否则,它将向xcom推送一个基于偏移量范围的有效查询,并返回True来运行它们。
  • 每个分支继续使用一个MySqlToGoogleCloudStorageOperator,其中将查询设置为{{ ti.xcom_pull('<ShortCircuitOperator_N>') }},其中字符串是前面ShortCircuitOperator的名称。
  • 如果在MySqlToGoogleCloudStorageOperator第一次添加DummyOperator作为所有这些MySqlToGoogleCloudStorageOperators的子操作符并生成trigger_rule ALL_DONE之后需要其他操作符,那么添加其他操作符作为该操作符的子操作符。

通过这种方式,您可以在必要时运行1至10个分页查询。他们可能会并行运行,但我不认为这是一个潜在的问题,只是考虑一下。

票数 1
EN

Stack Overflow用户

发布于 2018-10-11 04:33:18

气流为任务(操作者)之间的通信提供了XComs机制。在您的具体场景中,chunck_import任务可以先预计算所有where子句并将它们推入XCom;然后import_orders任务可以拉出XCom,读取所有where子句,并根据需要使用它们。

如果这个机制不适用于您的应用程序逻辑,那么请修改您的问题并解释为什么不行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52756378

复制
相关文章
如何使用RVM在FreeBSD 10.1上安装Ruby on Rails
Ruby on Rails,简称RoR,是一个用Ruby编写的非常流行的全栈Web应用程序开发框架。它允许您快速开发符合MVC(模型 - 视图 - 控制器)模式的Web应用程序。
一步
2018/10/10
4.6K0
SQL Server2000安全设置内容
查看存储过程对应文件名命令:sp_helpextendedproc “存储过程名”
全栈程序员站长
2021/04/28
7400
Navicat连接SQL Server2000提示错误08001
大家好,又见面了,我是你们的朋友全栈君。 数据库是SQL Server 2000 ---- 问题描述 无论是本机的数据库还是局域网内的,都出现如图的提示 使用系统自带的“SQL查询分析
全栈程序员站长
2022/09/27
1.9K0
如何使用Passenger和Nginx部署Rails
如果您是Ruby on Rails开发人员,可能需要Web服务器来托管您的Web应用程序。本教程将向您展示如何使用Phusion Passenger。作为Rails的Web服务器,Passenger易于安装,配置和维护,可与Nginx或Apache一起使用。在本教程中,我们将在Ubuntu上安装带有Nginx的Passenger。
乌鸦
2018/08/06
5K0
如何使用Passenger和Nginx部署Rails
使用rvm在Mac中安装ruby和rails
MacOS默认安装的是ruby 1.8.7,如果你想使用ruby 1.9.2的话,除了在官网下载源码编译安装外,可以使用rvm来协助安装。
EltonZheng
2021/01/22
3.2K0
在 FreeBSD 10.2 上安装使用 Nginx 的 Ghost
Node.js 是用于开发服务器端应用程序的开源的运行时环境。Node.js 应用使用 JavaScript 编写,能在任何有 Node.js 运行时的服务器上运行。它跨平台支持 Linux、Windows、OSX、IBM AIX,也包括 FreeBSD。Node.js 是 Ryan Dahl 以及在 Joyent 工作的其他开发者于 2009 年创建的。它的设计目标就是构建可扩展的网络应用程序。
用户8989785
2021/09/10
1.4K0
ruby on rails使用笔记
如果升级过程中说xcode版本太低 还得先升级xcode 重启电脑后继续升级ruby 升级完系统依然报错说xcode版本太低可以使用以下命令切换xcode版本
lilugirl
2019/05/28
1.1K0
使用rails实现最简单的CRUD
这里定义了路由hello/index,并且使用root方法将首页修改为了hello控制器下的index方法,也就是两路由的控制器一致。
用户1515472
2019/07/24
3.2K0
Rails MVC 和 CRUD(12)
保存成功就直接显示,如果保存失败,就重绘 new 页面,new 页面中加入了对错误信息的显示
franket
2021/11/25
2550
Rails MVC 和 CRUD(2)
MVC 分块设计有助于管理复杂的应用程序,因为可以在一段时间内只用关注一个方面;例如,可以在不依赖业务逻辑的情况下专注于视图设计;同时也让应用程序的测试更加容易;MVC 分层同时也简化了分组开发;不同的开发人员可同时开发视图、控制器逻辑和业务逻辑
franket
2021/11/24
3750
Rails MVC 和 CRUD(5)
创建了一个叫 ArticlesController 的类,继承自 ApplicationController
franket
2021/11/24
3390
Rails MVC 和 CRUD(7)
(这里的 /articles 明明对应两个方法,GET、POST ,有点不太明白,为什么这样指定就一定成了POST请求)
franket
2021/11/24
1960
Rails MVC 和 CRUD(9)
保存数据 修改 create 方法,对提交的数据进行保存 [root@h202 blog]# vim app/controllers/articles_controller.rb [root@h202 blog]# cat app/controllers/articles_controller.rb class ArticlesController < ApplicationController def new end def create # render plain: params
franket
2021/11/25
1900
Rails MVC 和 CRUD(15)
点击 【Destroy】 后会根据我们的定义弹出提示 连续删除几次后所剩无几 目前已经通过 Rails 实现了文章的 新建、显示、列出、更新、删除 操作 ---- 命令汇总 rails server -b 0.0.0.0 rails generate controller welcome index cat app/views/welcome/index.html.erb vim config/routes.rb grep -v " #" config/routes.rb | grep -v
franket
2021/11/25
3490
Rails MVC 和 CRUD(13)
定义 update 方法,并且添加 edit 链接和 show 链接 [root@h202 blog]# vim app/controllers/articles_controller.rb [root@h202 blog]# cat app/controllers/articles_controller.rb class ArticlesController < ApplicationController def new @article = Article.new end def
franket
2021/11/25
1620
Rails MVC 和 CRUD(3)
要在 Rails 中显示“My first test” 的静态页面,需要新建一个控制器和视图
franket
2021/11/24
7150
Rails MVC 和 CRUD(8)
再次提交一回 ---- 创建模型 Rails 提供了一个生成器用来创建模型 [root@h202 blog]# bin/rails generate model Article title:string text:text Running via Spring preloader in process 13216 invoke active_record create db/migrate/20160422140912_create_articles.rb c
franket
2021/11/25
2570
Rails MVC 和 CRUD(1)
Rails 的相关基础,详细可以参考 官方文档 和 Ruby China 的 Rails 入门
franket
2021/11/24
3480
Rails MVC 和 CRUD(6)
不过,通过查看源码,我们可以看到 action 部分指向的是当前页面 action="/articles/new" , 而这个页面 (Restfull API) 应该是用来进行显示的,而不是进行处理的
franket
2021/11/24
2700
Rails MVC 和 CRUD(10)
再次加载 可以成功显示了 ---- 列出所有文章 [root@h202 blog]# vim app/controllers/articles_controller.rb [root@h202 blog]# cat app/controllers/articles_controller.rb class ArticlesController < ApplicationController def new end def create # render plain: params[:ar
franket
2021/11/25
1820

相似问题

条件样式表设置:使用模块

20

自定义打印模块的打印样式表

10

自定义样式表

10

如何以drupal方式在drupal 7中添加IE特定样式表

10

当使用Omega响应主题时,IE7和IE8加载所有样式表

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文