像 bigquery 一样加入

join like bigquery

这是我第一次 post 在这里,所以我会尽量保持简单易读。

Postgres 中,我可以查找一个字符串包含另一个字符串的次数,在我的示例中,我有一个包含情绪的列表,我正在尝试查找它们在位于另一个 table 中的论坛 post 标题。在 Postgres 中,我通常使用 table1 LIKE string from table2 中的 LEFT Join ON 字符串来执行此操作。当我尝试在 Bigquery 中执行此操作时,它不起作用,我尝试使用 LIKECONTAINSREGEXP_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;

实际上,如果没有相等条件,JOINLEFT 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