像bigquery一样加入

时间:2016-09-28 09:23:22

标签: sql left-join google-bigquery

这是我在这里的第一篇文章,所以我会尽量保持简单易读。

Postgres中我可以查找字符串包含另一个字符串的次数,在我的示例中,我有一个带有情绪的列表,我正在尝试查找在论坛中提到它们的次数位于另一张桌子的帖子标题。在Postgres中,我通常使用LEFT Join ON中的table1 LIKE string from table2字符串执行此操作。当我尝试在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中是否可以这样做?

谢谢。

3 个答案:

答案 0 :(得分:0)

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), '%')(假设存在这样的密钥)。

答案 1 :(得分:0)

以下内容适用于旧版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

答案 2 :(得分:0)

非常感谢大家,确实我不得不使用标准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