向HiveOp传递模板变量

2024-10-04 05:29:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个jinja模板,我计划在配置单元中使用它来动态生成SQL。我的模板如下所示:

USE {{ db }};

CREATE EXTERNAL TABLE IF NOT EXISTS foo (
    A int,
    B int
)
stored as parquet
location ‘….’;

“db”是可以通过调用函数来派生的。我决定写一个扩展HiveExecOperator的操作符。在我的环境中,类层次结构是:

BaseOperator<;--BaseExecOperator<;-HiveExecOperator

我的TestHive操作符如下所示:

^{pr2}$

这个不起作用,因为模板中的{db}没有得到任何东西,hive语句失败。我还尝试在测试配置单元中重写render_template,如下所示:

class TestHive(HiveExecOperator):
    def render_template(self, attr, content, context):
    context['db'] = func1(..,)
    return super(TestHive, self).render_templates(attr, content, context)

这个方法失败,因为TestHive的父类没有render\u templates方法。在

Method: render_templates" is only defined in BaseOperator.

感谢任何帮助。在


Tags: ltself模板dbcontexttemplatecontentrender
1条回答
网友
1楼 · 发布于 2024-10-04 05:29:26

假设你指的是HiveOperator而不是HiveExecOperator,再看看你所描述的,我不认为你需要在这里推导任何类型的操作符。除非我没有看到一些额外的缺失信息,否则您只需要询问如何将函数调用的值作为参数传递到模板化命令中。在

HiveOperatorhql参数是template field。这意味着您应该能够像已经做过的那样简单地定义模板,然后将值作为操作符调用的一部分提供给它。但请记住在传入的变量前面加上params。参见:

my_query= """
    USE {{ params.db }};

    CREATE EXTERNAL TABLE IF NOT EXISTS foo (
    A int,
    B int
    )
    stored as parquet
    location .......
    """

run_hive_query = HiveOperator(
    task_id="my_task",
    hql=my_query,
    params={ 'db': func1(...) },
    dag=dag
)

相关问题 更多 >