有没有办法从 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 函数?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从移动浏览器调用导航?

从 JavaScript 调用 php 函数

从托管 bean 调用 JavaScript 函数

有没有办法从静态方法访问缓存或会话?

使用 node.js 从 C++ 调用 JavaScript

从URL /地址栏调用Javascript函数