有没有办法从 javascript 调用 bigquery API 函数?
Posted
技术标签:
【中文标题】有没有办法从 javascript 调用 bigquery API 函数?【英文标题】:Is there any way to call bigquery API functions from javascript? 【发布时间】:2016-10-28 03:30:08 【问题描述】:这里我有一个 scala UDF,它检查一个 url 是否是我的域之一。要检查“to_site”是否是我的域之一,我在 javascript 中使用indexOf
。
CREATE TEMPORARY FUNCTION our_domain(to_site STRING)
RETURNS BOOLEAN
LANGUAGE js AS """
domains = ['abc.com', 'xyz.com'];
if (to_site == null || to_site == undefined) return false;
for (var i = 0; i < domains.length; i++)
var q= DOMAIN('XYZ');
if (String.prototype.toLowerCase.call(to_site).indexOf(domains[i]) !== -1)
return true;
return false;
""";
SELECT our_domain('www.foobar.com'), our_domain('www.xyz.com');
这会返回 false,然后返回 true。
如果我可以使用 javascript 中的 DOMAIN(url) 函数会更好。 indexOf
不是很好,因为它会匹配 www.example.com?from=www.abc.com,而实际上 example.com 不是我的域之一。 Javascript 也有一个 (new URL('www.example.com/q/z')).hostname 来解析域组件,但它包括像“www”这样的子域。这使比较复杂化。 Bigquery 的 DOMAIN(url) 函数只提供域并且知道谷歌它是快速的 C++。
我知道我能做到
our_domain(DOMAIN('www.xyz.com'))
但总的来说,最好在 javascript 中使用一些 bigquery API 函数。这可能吗?
我也试过了
CREATE TEMPORARY FUNCTION our_domain1(to_site String)
AS (our_domain(DOMAIN(to_site));
但它没有说 DOMAIN 不存在。
【问题讨论】:
【参考方案1】:BigQuery 旧版 SQL 支持DOMAIN() 函数,而 Scalar UDFs 是 BigQuery 标准 SQL 的一部分。 因此,不幸的是,不,至少到目前为止,您不能将 DOMAIN() 函数与使用标量 UDF 的代码一起使用。
而且,不,您不能在 JS [Scalar] UDF 中使用 SQL 函数,但您可以在 SQL UDFs 中使用它们
最后,正如我在对您上一个问题的回答中所建议的那样——在像这样的特定场景中——你最好使用 SQL Scalar SQL 与 JS Scalar UDF——它们没有 JS UDF 所具有的LIMITs
【讨论】:
当然。喜欢帮助:o)【参考方案2】:旧版 SQL 中的 DOMAIN
函数或多或少只是一个正则表达式。你见过this previous question about DOMAIN
吗?正如 Mikhail 指出的那样,您应该能够定义一个 SQL UDF,它使用正则表达式来提取域,然后检查它是否在您的列表中。
【讨论】:
以上是关于有没有办法从 javascript 调用 bigquery API 函数?的主要内容,如果未能解决你的问题,请参考以下文章