Snowflake 支持 JavaScript UDF,但 DOM 解析器不起作用(出于安全原因)。
例如,我在使用 JS UDF 时遇到这些错误:
JavaScript execution error: Uncaught ReferenceError: document is not defined
JavaScript execution error: Uncaught ReferenceError: DOMParser is not defined
etc
那我如何用 Snowflake 解析 HTML 文档?
答案 0 :(得分:2)
您可以使用 Java UDF 和 jsoup 来解析 SQL 中的 HTML。
首先 PUT
使用 SnowSQL 就位的 jsoup.jar:
put 'file:///Users/fhoffa/Downloads/jsoup-1.13.1.jar' @~;
然后你可以为它创建一个 Java UDF。
例如,从 HTML 中提取文本:
create or replace function jsoup_text(x string)
returns string
language java
imports = ('@~/jsoup-1.13.1.jar')
handler='MyClass.text'
as
$$
import org.jsoup.Jsoup;
class MyClass {
public static String text(String x) {
return Jsoup.parse(x).text();
}
}
$$;
可以这样调用:
select jsoup_text('This is a <strong>strong</strong> number <date>2013</date>');
返回没有任何 HTML 额外元素的文本。
或者从文档中提取所有链接 URL:
create or replace function jsoup_all_links(x string)
returns array
language java
imports = ('@~/jsoup-1.13.1.jar')
handler='MyClass.extractLinks'
as
$$
import org.jsoup.Jsoup;
class MyClass {
public static String[] extractLinks(String x) {
return Jsoup.parse(x)
.select("a[href]")
.stream().map(s -> s.attr("abs:href"))
.toArray(String[]::new);
}
}
$$;
它已经准备好工作了:
select jsoup_all_links('The best <a href="http://snowflake.com">Snowflake</a> <a href="https://reddit.com/r/snowflake">subreddit</a>');
返回数组 ["http://snowflake.com", "https://reddit.com/r/snowflake"]
。
阅读更多: