如何使用雪花 UDF 解析 HTML

时间:2021-06-18 03:46:22

标签: javascript java html snowflake-cloud-data-platform user-defined-functions

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 文档?

1 个答案:

答案 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"]

阅读更多: