2016-09-28 88 views
0

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

Postgres我可以查找一个字符串包含另一个字符串的次数,在我的例子中,我有一个列表的情绪,我试图寻找他们在论坛帖子标题中提到了多少次坐在另一张桌子上。在Postgres我通常使用LEFT Join ON字符串从table1 LIKE string from table2这样做。当我试图在Bigquery中这样做时,它不起作用,我尝试使用LIKE,CONTAINSREGEXP_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

谢谢。

+0

您需要使用#StandardSql加入上的不平等https://cloud.google.com/bigquery/sql-reference/enabling-standard- SQL – Pentium10

回答

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

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