簡體   English   中英

將模板變量傳遞給HiveOperator

[英]Passing template variables to HiveOperator

我有一個Jinja模板,打算在Hive中用於動態SQL生成。 我的模板如下所示:

USE {{ db }};

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

“ db”是可以通過進行函數調用而派生的。 我決定寫一個擴展HiveExecOperator的運算符。 在我的環境中,類層次結構為:

BaseOperator <---- BaseExecOperator <-HiveExecOperator

我的TestHive運算符如下所示:

class TestHive(HiveExecOperator):
    def pre_execute(self, context):
        context[‘db’] = func1(…,,)
        return context['ti'].render_templates()

由於模板中的{{db}}無法獲得任何結果,因此hive語句失敗。 我還嘗試如下重寫TestHive中的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_templates方法,因此此方法失敗。

Method: render_templates" is only defined in BaseOperator.

任何幫助表示贊賞。

假設您指的是HiveOperator而不是HiveExecOperator,並且查看了您所描述的內容,那么我認為您不需要在這里派生任何類型的運算符。 除非我沒有看到一些額外的缺失信息,否則您只是在問如何將函數調用的值作為參數傳遞給模板命令。

HiveOperatorhql參數是一個模板字段 這意味着您應該能夠像已經完成的那樣簡單地定義模板,然后在操作員調用中為其提供值。 但是請記住在要傳遞的變量前加上參數。 看到:

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
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM