使用 SQL 查询从 BigQuery 用户定义函数返回值

Posted

技术标签:

【中文标题】使用 SQL 查询从 BigQuery 用户定义函数返回值【英文标题】:Using SQL Query to return value from BigQuery User Defined Function 【发布时间】:2018-04-02 14:03:58 【问题描述】:

我可以在 Google BigQuery 用户定义函数 中使用查询来返回一些值吗?我一直在搜索文档和 *** 几个小时,但没有任何运气,我有一个非常具体的用例,我需要根据多列的值返回单个标量值。

以下将是查询的用例:

SELECT campaign,source,medium, get_channel(campaign,source,medium)
FROM table_name

get_channel() UDF 将使用这些参数和复杂的选择语句为行返回单个标量值。我已经准备好查询,我只需要找到一种在 UDF 中使用该查询的方法,老实说,我对此感到不知所措,而且没有任何原因。

我的用例正确吗?这甚至可能吗?有没有其他方法可以做到这一点?

【问题讨论】:

文档在这里没有帮助吗? cloud.google.com/bigquery/docs/reference/standard-sql/… @martin 我访问过这些文档,但它对我的情况没有帮助,也就是说,我在其中找不到我想要的东西。 【参考方案1】:

看起来您想使用 UDF 从某个查找表中选择标量值。如果是这样,否 - 您不能在 UDF 中引用表 - 在 LimitsLimitations 中查看更多信息

但是,如果您只想对参数进行一些复杂的操作 - 当然 - 请参阅下面的虚拟示例

#standardSQL
CREATE TEMPORARY FUNCTION get_channel(campaign INT64, source INT64, medium INT64) AS ((
  SELECT campaign + source + medium as result_of_complex_select_statement
));
WITH `project.dataset.table_name` AS (
  SELECT 1 AS campaign, 2 AS source, 3 AS medium UNION ALL
  SELECT 4, 5, 6 UNION ALL
  SELECT 7, 8, 9
)
SELECT 
  campaign,
  source,
  medium, 
  get_channel(campaign,source,medium) AS channel
FROM `project.dataset.table_name`

你应该使用 JOIN 来实现你的目标

【讨论】:

是的,我正在尝试使用这些参数从映射表中选择一个标量值。今晚晚些时候我在办公室时,我会试试你的答案,如果可行,我会在这里更新。 那么这并不能解决我的问题:(我会用不同的逻辑尝试新鲜的 是的,你应该使用 JOIN 来实现你的目标 但是,这个问题肯定得到了回答——你问你是否可以这样做——对吧? :o) 感谢@Mikhael,我最初尝试使用连接,但后来转而使用 UDF,因为这将是一个在多个地方使用的通用函数。我认为 BigQuery 中的 UDF 与 SQL Server 中的 UDF 有点相同。那么,回到故事板。

以上是关于使用 SQL 查询从 BigQuery 用户定义函数返回值的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apps 脚本定义/创建 BigQuery 保存视图的 SQL 查询

bigquery - 自定义字段上的分区 - 仅适用于标准 SQL?

在 bigquery 标准 sql 上提取两个日期之间的小时数

sql [查询所有用户的最高矿层进度] BigQuery #BigQuery

在 Watson Studio 中使用变量查询 Bigquery

BigQuery 月度活跃用户?