我有一个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.
感谢您的帮助。
答案 0 :(得分:1)
假设是指HiveOperator而不是HiveExecOperator,并且查看了您所描述的内容后,我认为您不需要在这里派生任何类型的运算符。除非我没有看到一些额外的缺失信息,否则您只是在问如何将函数调用的值作为参数传递给模板命令。
hql
的{{1}}参数是template field。这意味着您应该能够像已经完成的那样简单地定义模板,然后在操作员调用中为其提供值。但是请记住在要传递的变量前加上参数。参见:
HiveOperator