【问题标题】:Is there any way to call bigquery API functions from javascript?有没有办法从 javascript 调用 bigquery API 函数?
【发布时间】: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 不存在。

【问题讨论】:

    标签: google-bigquery google-cloud-platform


    【解决方案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,它使用正则表达式来提取域,然后检查它是否在您的列表中。

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 2010-11-16
      • 2012-08-05
      • 2011-01-21
      • 2011-04-27
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 2011-11-30
      相关资源
      最近更新 更多