创建后是否可以编辑气流操作员?

时间:2019-04-04 11:54:49

标签: python airflow google-cloud-composer

我有一个Python脚本,该脚本基于JSON文件动态创建任务(气流操作员)和DAG,该JSON文件映射了所需的每个选项。 该脚本还具有创建所需的任何运算符的专用功能。 有时我想基于映射激活一些条件选项...例如在bigqueryOperator中,有时我需要一个time_partitioning和一个destination_table,但是我不想在每个映射的任务上进行设置。

我试图阅读有关BaseOperator的文档,但看不到任何类似Java的set方法。

返回运算符的函数,例如bigQuery one

def bqOperator(mappedTask):
    try:
        return BigQueryOperator(
        task_id=mappedTask.get('task_id'),
        sql=mappedTask.get('sql'),  
##destination_dataset_table=project+'.'+dataset+'.'+mappedTask.get('target'),
        write_disposition=mappedTask.get('write_disposition'),
        allow_large_results=mappedTask.get('allow_large_results'),
        ##time_partitioning=mappedTask.get('time_partitioning'),
        use_legacy_sql=mappedTask.get('use_legacy_sql'),
        dag=dag,
        )
    except Exception as e:
        error = 'Error creating BigQueryOperator for task : ' + mappedTask.get('task_id')
        logger.error(error)
        raise Exception(error) 

没有分区的json文件中的mappedTask

        {
            "task_id": "TEST_TASK_ID",
            "sql": "some fancy query",
            "type": "bqOperator",
            "dependencies": [],
            "write_disposition": "WRITE_APPEND",
            "allow_large_results": true,
            "createDisposition": "CREATE_IF_NEEDED",
            "use_legacy_sql": false
        },

带有分区的json文件中的mappedTask

        {
            "task_id": "TEST_TASK_ID_PARTITION",
            "sql": "some fancy query",
            "type": "bqOperator",
            "dependencies": [],
            "write_disposition": "WRITE_APPEND",
            "allow_large_results": true,
            "createDisposition": "CREATE_IF_NEEDED",
            "use_legacy_sql": false,
                        "targetTable": "TARGET_TABLE",
            "time_partitioning": {
                "field": "DATE_TO_PART",
                "type": "DAY"
            }
        },

2 个答案:

答案 0 :(得分:1)

如下更改bqOperator来处理这种情况,基本上,当在json中找不到该字段时,它将通过None:

def bqOperator(mappedTask):
    try:
        return BigQueryOperator(
        task_id=mappedTask.get('task_id'),
        sql=mappedTask.get('sql'),  
        destination_dataset_table="{}.{}.{}".format(project, dataset, mappedTask.get('target')) if mappedTask.get('target', None)  else None,
        write_disposition=mappedTask.get('write_disposition'),
        allow_large_results=mappedTask.get('allow_large_results'),
        time_partitioning=mappedTask.get('time_partitioning', None),
        use_legacy_sql=mappedTask.get('use_legacy_sql'),
        dag=dag,
        )
    except Exception as e:
        error = 'Error creating BigQueryOperator for task : ' + mappedTask.get('task_id')
        logger.error(error)
        raise Exception(error) 

答案 1 :(得分:0)

python中没有私有方法或字段,因此您可以直接设置和获取

之类的字段
op.use_legacy_sql = True

鉴于我强烈反对这样做,因为这是一种真正的代码味道。相反,您可以修改工厂类以将一些默认值应用于json数据。 甚至更好的是,对json本身应用默认值。比保存并使用更新的json。这将使事情更加可预测。