这里我有一个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不存在。
答案 0 :(得分:1)
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,然后检查它是否在您的列表中。