2016-09-28 4 views
0

Es ist meine erste Post hier, also werde ich versuchen, es einfach und leicht zu lesen.beitreten wie bigquery

In Postgres kann ich nach der Anzahl suchen, wie oft eine Zeichenfolge eine andere Zeichenfolge enthält, in meinem Beispiel habe ich eine Liste mit Sentiments und ich versuche zu suchen, wie oft sie in einem Forumposttitel erwähnt werden sitzt in einem anderen Tisch. In Postgres mache ich das normalerweise mit LEFT Join ON String von table1 LIKE string from table2. Als ich versuchte, es in Bigquery zu tun, funktioniert es nicht und ich versuchte mit LIKE, CONTAINS und REGEXP_MATCH. Dies wäre die Art von Abfrage, die ich gerne machen würde.

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 

Wissen Sie, ob dies in Bigquery überhaupt möglich ist?

Vielen Dank.

+0

Sie müssen #StandardSql verwenden, um auf Ungleichheiten zu verbinden https://cloud.google.com/bigquery/sql-reference/enabling-standard- sql – Pentium10

Antwort

0

Vielen Dank Jungs in Legacy-SQL arbeiten, in der Tat hatte ich SQL-Standard zu verwenden, aber es mit großen Datensätzen nicht funktioniert so einer meiner Kollegen mir eine Lösung finden half durch Teilen der Zeichenfolge in Wörter. Das Endergebnis ist nicht perfekt, aber funktional und es sieht wie folgt aus:

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

Die Abfrage in standard SQL wäre so etwas wie dieses:

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; 

Praktisch ein JOIN oder LEFT JOIN Sprechen ohne eine Gleichheitsbedingung nicht sehr skalierbar ist. Abhängig von der Größe Ihrer Tabellen kann Standard-SQL Sie zwingen, auch eine Gleichheit, z. ON t1.key = t2.key AND lower(post_title) LIKE CONCAT('%', lower(sentiment), '%') (unter der Annahme, dass ein solcher Schlüssel existiert).

0

Im Folgenden soll

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