像 bigquery 一样加入
join like bigquery
这是我第一次 post 在这里,所以我会尽量保持简单易读。
在 Postgres
中,我可以查找一个字符串包含另一个字符串的次数,在我的示例中,我有一个包含情绪的列表,我正在尝试查找它们在位于另一个 table 中的论坛 post 标题。在 Postgres
中,我通常使用 table1 LIKE string from table2
中的 LEFT Join ON
字符串来执行此操作。当我尝试在 Bigquery
中执行此操作时,它不起作用,我尝试使用 LIKE
、CONTAINS
和 REGEXP_MATCH
。这些将是我想要执行的查询类型。
SELECT sentiment_type, count(*) FROM
((SELECT forum, page_link, post_title, user, posted_date, content
FROM [sandbox:Forum_data.forum_table]) t1
JOIN [sandbox:Taxonomies.sentiment_taxonomy] t2
ON lower(post_title) LIKE '%'||lower(sentiment)||'%') a
GROUP BY sentiment_type, sentiment
ORDER BY 3 desc
你知道这在 Bigquery
中是否可行吗?
谢谢。
standard SQL 中的查询将是这样的:
SELECT sentiment_type, count(*)
FROM (
SELECT forum, page_link, post_title, user, posted_date, content
FROM `sandbox.Forum_data.forum_table`) t1
JOIN `sandbox.Taxonomies.sentiment_taxonomy` t2
ON lower(post_title) LIKE CONCAT('%', lower(sentiment), '%')
GROUP BY sentiment_type, sentiment
ORDER BY 3 desc;
实际上,如果没有相等条件,JOIN
或 LEFT JOIN
的可扩展性就不是很好。根据表格的大小,标准 SQL 可能会强制您也包含相等性,例如ON t1.key = t2.key AND lower(post_title) LIKE CONCAT('%', lower(sentiment), '%')
(假设存在这样的密钥)。
以下应该适用于旧版 SQL
SELECT sentiment_type, sentiment, COUNT(*) as volume
FROM [sandbox:Forum_data.forum_table] t1
CROSS JOIN [sandbox:Taxonomies.sentiment_taxonomy] t2
WHERE LOWER(post_title) LIKE '%' + LOWER(sentiment) + '%'
GROUP BY sentiment_type, sentiment
ORDER BY 3 desc
非常感谢你们,事实上我必须使用标准 SQL 但它不适用于大型数据集,所以我的一位同事通过将字符串拆分为单词来帮助我找到解决方案。最终结果并不完美,但功能正常,看起来像这样:
SELECT sentiment_type, SUM(vol) vol FROM
(
SELECT sentiment_type, a.vol vol, a.id id
FROM (
SELECT *
FROM (SELECT SPLIT(content,' ') AS content_ind
,Vol
,ID
FROM (SELECT content
,Vol
,ROW_NUMBER() OVER (ORDER BY content) ID
FROM (SELECT LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(content,'%',' '),'!',' '),'"',' '),'?',' '),'.',' '),',',' '),'/',' '),"'",' '),'-',' '),';',' '),':',' '),'(',' '),')',' '),'*',' '),'_',' '),'&',' '),'=',' '),'@',' ')) content
,COUNT(content) vol
FROM [sandbox:Forum_data.Expat_forum_data]
GROUP BY content)
ORDER BY 3)
)
GROUP BY 1,2,3) a JOIN
(SELECT LTRIM(RTRIM(sentiment)) sentiment, sentiment_type FROM [sandbox:Taxonomies.sentiment_taxonomy] WHERE LTRIM(RTRIM(sentiment)) NOT LIKE '% %') b
ON a.content_ind = b.sentiment
GROUP BY 1,2,3)
GROUP BY 1
ORDER BY 2 DESC
这是我第一次 post 在这里,所以我会尽量保持简单易读。
在 Postgres
中,我可以查找一个字符串包含另一个字符串的次数,在我的示例中,我有一个包含情绪的列表,我正在尝试查找它们在位于另一个 table 中的论坛 post 标题。在 Postgres
中,我通常使用 table1 LIKE string from table2
中的 LEFT Join ON
字符串来执行此操作。当我尝试在 Bigquery
中执行此操作时,它不起作用,我尝试使用 LIKE
、CONTAINS
和 REGEXP_MATCH
。这些将是我想要执行的查询类型。
SELECT sentiment_type, count(*) FROM
((SELECT forum, page_link, post_title, user, posted_date, content
FROM [sandbox:Forum_data.forum_table]) t1
JOIN [sandbox:Taxonomies.sentiment_taxonomy] t2
ON lower(post_title) LIKE '%'||lower(sentiment)||'%') a
GROUP BY sentiment_type, sentiment
ORDER BY 3 desc
你知道这在 Bigquery
中是否可行吗?
谢谢。
standard SQL 中的查询将是这样的:
SELECT sentiment_type, count(*)
FROM (
SELECT forum, page_link, post_title, user, posted_date, content
FROM `sandbox.Forum_data.forum_table`) t1
JOIN `sandbox.Taxonomies.sentiment_taxonomy` t2
ON lower(post_title) LIKE CONCAT('%', lower(sentiment), '%')
GROUP BY sentiment_type, sentiment
ORDER BY 3 desc;
实际上,如果没有相等条件,JOIN
或 LEFT JOIN
的可扩展性就不是很好。根据表格的大小,标准 SQL 可能会强制您也包含相等性,例如ON t1.key = t2.key AND lower(post_title) LIKE CONCAT('%', lower(sentiment), '%')
(假设存在这样的密钥)。
以下应该适用于旧版 SQL
SELECT sentiment_type, sentiment, COUNT(*) as volume
FROM [sandbox:Forum_data.forum_table] t1
CROSS JOIN [sandbox:Taxonomies.sentiment_taxonomy] t2
WHERE LOWER(post_title) LIKE '%' + LOWER(sentiment) + '%'
GROUP BY sentiment_type, sentiment
ORDER BY 3 desc
非常感谢你们,事实上我必须使用标准 SQL 但它不适用于大型数据集,所以我的一位同事通过将字符串拆分为单词来帮助我找到解决方案。最终结果并不完美,但功能正常,看起来像这样:
SELECT sentiment_type, SUM(vol) vol FROM
(
SELECT sentiment_type, a.vol vol, a.id id
FROM (
SELECT *
FROM (SELECT SPLIT(content,' ') AS content_ind
,Vol
,ID
FROM (SELECT content
,Vol
,ROW_NUMBER() OVER (ORDER BY content) ID
FROM (SELECT LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(content,'%',' '),'!',' '),'"',' '),'?',' '),'.',' '),',',' '),'/',' '),"'",' '),'-',' '),';',' '),':',' '),'(',' '),')',' '),'*',' '),'_',' '),'&',' '),'=',' '),'@',' ')) content
,COUNT(content) vol
FROM [sandbox:Forum_data.Expat_forum_data]
GROUP BY content)
ORDER BY 3)
)
GROUP BY 1,2,3) a JOIN
(SELECT LTRIM(RTRIM(sentiment)) sentiment, sentiment_type FROM [sandbox:Taxonomies.sentiment_taxonomy] WHERE LTRIM(RTRIM(sentiment)) NOT LIKE '% %') b
ON a.content_ind = b.sentiment
GROUP BY 1,2,3)
GROUP BY 1
ORDER BY 2 DESC