1

Hala Google Cloud Datalab için yeni ve parametreli sorgular yürütme bazı sorunlarınız var.Google Cloud Datalab iPython defterinde TABLE_QUERY parametresi için geçen parametreler

ben Datalab tutorial Sorgu parametrelerini geçirilmesi için örnek izledi ve aşağıdaki sorguyu uygulamak için çalıştı:

%sql 
SELECT user_id, localTime, event 
FROM (SELECT user_id, DATE_ADD(date, timezoneOffset, "SECOND") AS localTime, event 
    FROM (TABLE_QUERY([my_project:my_dataset:user_events], 
     'table_id CONTAINS "user_events_0" 
     AND RIGHT(table_id, 8) BETWEEN "20160401" AND "20160408"')) 
    WHERE 
    user_id IS NOT NULL AND 
    timezoneOffset IS NOT NULL AND 
    event IS NOT NULL) 
WHERE 
    user_id IN (SELECT id FROM [my_project:my_dataset.topUsers]) 
ORDER BY user_id, localTime 

Ben endeksler 0,1,2 ile tüm user_events tablolar üzerinde yineleme yapmak istiyorum 3 ... Bu amaçla, TABLE_QUERY parametresini geçmek ve bir tablonun tek bir yinelemesinde her tabloyu sorgulamak istiyorum - tüm tabloları aynı anda değil.

1. I vb yeni bir sorgu (%%sql --module topUserEvents tanımlanan) (I, her tablo içinde kullanıcı kayıtlarını sipariş etmek gerekir çünkü kaynaklar tablolar aynı anda her user_events üzerinden bir sorgu yürütülürken aşıldığında)) ve değiştirilmesi Aşağıdaki

FROM (TABLE_QUERY([my_project:my_dataset:user_events], 
     'table_id CONTAINS "user_events_0" 
     AND RIGHT(table_id, 8) BETWEEN "20160401" AND "20160408"')) 

ile: yukarıdaki sorgudan parçası

FROM (TABLE_QUERY([my_project:my_dataset:user_events], 
     'table_id CONTAINS "user_events_'+$tableNr+ 
     '" AND RIGHT(table_id, 8) BETWEEN "20160401" AND "20160408"')) 

bir dize olarak masa numarasını geçirerek, sorgu İdam - işe yaramadı:

invalidQuery: Expected a string literal for TABLE_QUERY clause 

2.) Ben de orjinal sorgunun kısmını yerine, bütün dize geçirerek çalıştı:

invalidQuery: Error preparing subsidiary query: 
com.google.cloud.helix.server.bqsql.common.BigQueryException: 
Encountered " "CONTAINS" "CONTAINS "" at line 1, column 94. 
Was expecting: 
")" ... 
:

sorgusu, tüm dize geçirerek Gerçekleştirilen
FROM (TABLE_QUERY([my_project:my_dataset:user_events], $tableString)) 

, Büyük Sorgu İstisna döndü


bilen var mı böyle bir durumda ab gibi TABLE_QUERY parametresi için bir dize (bir kısmını) geçmek nasıl ove?

Herhangi bir yardım büyük takdir :)

cevap

1

sen deneyebilir miyim aşağıdaki?

modül 'test1' tanımlayın:

%%sql --module test1 
SELECT count(*) 
FROM TABLE_QUERY(publicdata:samples, 
    'MSEC_TO_TIMESTAMP(creation_time) < DATE_ADD(CURRENT_TIMESTAMP(), -7, $period)') 

Çalıştır sorgu:

period = 'DAY' 
bq.Query(test1, period = period).sample() 

'test2' modülünü tanımlayın:

%sql --module test2 
SELECT user_id, localTime, event 
FROM (SELECT user_id, DATE_ADD(date, timezoneOffset, "SECOND") AS localTime, event 
    FROM (TABLE_QUERY([my_project:my_dataset:user_events], 
     'table_id CONTAINS $events_table_num 
     AND RIGHT(table_id, 8) BETWEEN "20160401" AND "20160408"')) 
    WHERE 
    user_id IS NOT NULL AND 
    timezoneOffset IS NOT NULL AND 
    event IS NOT NULL) 
WHERE 
    user_id IN (SELECT id FROM [my_project:my_dataset.topUsers]) 
ORDER BY user_id, localTime 

Çalıştır sorgusu:

events_table_num = 'user_events_0' 
bq.Query(test2,events_table_num = events_table_num).sample() 
+1

Çok teşekkürler!Ben de benzer bir çözüm denedim, ama çalışmadı çünkü geçen argümanın etrafındaki alıntıları kullandım; FROM (TABLE_QUERY ([my_project: my_dataset: user_events], 'table_id CONTAINS "$ events_table_num" VE DOĞRU (table_id, 8) "20160401" VE "20160408"') ARASINDAKİ BİRLİKTE Çünkü tekliflerin işe yaramaması gerekiyor. Tekrar teşekkürler :) – user2107356

İlgili konular