我正在尝试对 BigQuery 公共数据集中的 Stackoverflow 标签进行聚类。 据我的一位数据专家同事说,标准程序是将每个标签链接到“最近”的标签。 为此,我计划搜索摘录中的相关标签并生成一个包含以下列的表格
例如,考虑以下标签信息
行 | id | 标签名称 | 摘录 | 描述 |
---|---|---|---|---|
3 | 61060 | 打开包装 | OpenWrap 是 .net 平台的依赖管理器 | OpenWrap 是 .net 平台的依赖管理器。可以在 http://openwrap.org 找到。 |
我想生成一个表格,例如
id | 标签名称 | .net | 依赖管理器 | java | 春天 |
---|---|---|---|---|---|
61060 | 打开包装 | 1 | 1 | 0 | 0 |
这将允许我运行 k 均值计算。
为此,我想使用 SQL PIVOT,但我不明白如何操作。
到目前为止, 我的 SQL 查询看起来像
DECLARE tag_names ARRAY <STRING> ;
SET tag_names = ARRAY (
SELECT tags.tag_name
FROM ${ref("stackoverflow_tags_with_non_null_excerpt")} AS tags
);
SELECT *
FROM ${ref("stackoverflow_tags_with_non_null_excerpt")} AS tags
PIVOT(
-- I don't know what I'm doing
)
我从来没有写过任何 PIVOT,所以我应该考虑什么,我想运行“为我摘录中的每个标签返回 1,否则返回 0”之类的东西,这应该用
excerpt like "%s{tag}%s" for tag in UNNEST(tag_names)
来实现
我离好的答案还远吗?
创建一个数组
tag_names
,其中包含数据集中的所有标签名称。然后,在原始表和未嵌套的 tag_names 数组之间执行 CROSS JOIN
。此组合将每个标签与数组中的每个标签名称配对。
在 SELECT 子句中,它使用 MAX 聚合函数中的 CASE 语句来确定 tag_name 是否出现在摘录中。如果是,则将 is_related 设置为 1;否则,将其设置为 0。
最后,它按 id 和 tag_name 对结果进行分组以获得所需的格式。
此查询将为您提供一个表,其中每行代表一个标签,列代表该标签是否根据摘录中标签名称的存在与其他每个标签相关。如果相关,is_lated 列将为 1,如果不相关,则为 0。您可以使用此表进行聚类或需要执行的任何其他分析。
这个示例查询可能会给您一个提示:
DECLARE tag_names ARRAY<STRING>;
SET tag_names = ARRAY(
SELECT tag_name
FROM ${ref("stackoverflow_tags_with_non_null_excerpt")}
);
-- Use a CROSS JOIN to pair each tag with each tag name in the array
SELECT
t.id AS id,
t.tag_name AS tag_name,
MAX(CASE WHEN t.excerpt LIKE CONCAT('%', tn, '%') THEN 1 ELSE 0 END) AS is_related
FROM
${ref("stackoverflow_tags_with_non_null_excerpt")} AS t
CROSS JOIN
UNNEST(tag_names) AS tn
GROUP BY
t.id,
t.tag_name;