我在Clickhouse中创建了UDF,例如:
create function test_function AS (in_param) -> (select col1 from table1 t1 join table2 t2 on t1.key=t2.key where t1.key = in_param);
当我尝试以下示例时,只需显式传递字符串值即可正常工作:
select test_function('10000');
但是下面的例子失败了:
select test_function(x_id) from tablex where colx='somevalue';
失败并出现错误:
Code: 47. DB::Exception: Missing columns: 'x_id' while processing query: 'select col1 from table1 t1 join table2 t2 on t1.key=t2.key where t1.key = x_id'
就好像 x_id 的值没有传递给函数一样,看起来该函数正在处理字符串“x_id”而不是字段 x_id 的值。有什么建议吗?
我在 Clickhouse 中也遇到过类似的不明显行为。
Clickhouse 将列
x_id
传递为 in_param
,但 table1 和 table2 中没有该列
select col1 from table1 t1 join table2 t2 on t1.key=t2.key where t1.key = in_param
所以查询失败。
当我在 Clikhouse 开发者电报聊天中询问此行为时,他们回答我,出于性能考虑,这是预期行为。
唯一的解决方案是使用字典代替
table1
和table2
,并在UDF主体中使用dictGet
而不是查询常规表。