有没有办法从javascript调用bigquery API函数?

时间:2016-10-28 03:30:08

标签: google-bigquery google-cloud-platform

这里我有一个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还有一个(新的URL('www.example.com/q/z'))。hostname来解析域组件,但它包含子域名,如'www。'这使比较变得复杂。 Bigquery的DOMAIN(url)函数只提供域名并且知道google它是快速的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不存在。

2 个答案:

答案 0 :(得分:1)

BigQuery Legacy SQL支持

DOMAIN()函数,而Scalar UDF是BigQuery Standard SQL的一部分。
所以,不幸的是,不,你不能使用DOMAIN()函数和至少使用Scalar UDF的代码。

而且,不,你不能在JS [Scalar] UDF中使用SQL函数,但你可以在SQL UDFs 中使用它们

最后,正如我在上一个问题的回答中建议的那样 - 在这样的特定情况下 - 你最好使用SQL Scalar SQL与JS Scalar UDF - 他们没有JS LIMIT那个JS UDF有

答案 1 :(得分:1)

旧版SQL中的DOMAIN函数或多或少只是一个正则表达式。你看过this previous question about DOMAIN了吗?正如Mikhail指出的那样,您应该能够定义一个使用正则表达式提取域的SQL UDF,然后检查它是否在您的列表中。