2016-09-28 85 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