मैं की तर्ज पर कुछ करना चाहता हूं:

SELECT some_things
FROM `myproject.mydataset.mytable_@suffix`

लेकिन यह काम नहीं करता है क्योंकि पैरामीटर तालिका नाम के अंदर विस्तारित नहीं है।

यह करता है, वाइल्डकार्ड का उपयोग करके काम करता है टेबल:

SELECT some_things
FROM `myproject.mydataset.mytable_*`
WHERE _TABLE_SUFFIX = @suffix

हालाँकि, इसमें कुछ समस्याएं हैं:

  • यदि मैं पैरामीटर को गलत टाइप करता हूं, तो यह क्वेरी मुझ पर ज़ोर से चिल्लाने के बजाय चुपचाप शून्य पंक्तियाँ लौटाती है।

  • वाइल्डकार्ड से क्वेरी करते समय क्वेरी कैशिंग काम करना बंद कर देता है।

  • यदि अन्य तालिकाएँ mytable_ उपसर्ग के साथ मौजूद हैं, तो उनका स्कीमा समान होना चाहिए, भले ही वे प्रत्यय से मेल न खाते हों। अन्यथा, अजीब चीजें होती हैं। ऐसा लगता है कि BigQuery या तो सभी स्तंभों के संघ की गणना करता है, या एक मनमानी तालिका का स्कीमा लेता है; यह प्रलेखित नहीं है और मैंने इसे विस्तार से नहीं देखा।

क्या एकल तालिका को क्वेरी करने का कोई बेहतर तरीका है जिसका नाम किसी क्वेरी पैरामीटर पर निर्भर करता है?

7
Thomas 23 जुलाई 2018, 12:11

3 जवाब

सबसे बढ़िया उत्तर

आपकी बताई गई समस्याओं का उत्तर देने के लिए:

  1. टेबल स्कैनिंग FROM क्लॉज में होती है, WHERE क्लॉज में फ़िल्टरिंग होती है [1] इस प्रकार यदि WHERE की स्थिति मेल नहीं खाती है तो एक खाली परिणाम वापस कर दिया जाएगा।

  2. "फ़िलहाल, वाइल्डकार्ड से क्वेरी करते समय कैश्ड परिणाम समर्थित नहीं हैं" [2< /ए>]।

  3. "बिगक्वेरी सबसे हाल ही में बनाई गई तालिका के लिए स्कीमा का उपयोग करता है जो वाइल्डकार्ड से स्कीमा के रूप में मेल खाता है" [3]. आपने अपने उपयोग के मामले में किस तरह की अजीब चीजों का सामना किया है? "वाइल्डकार्ड तालिका उन सभी तालिकाओं के संघ का प्रतिनिधित्व करती है जो वाइल्डकार्ड अभिव्यक्ति से मेल खाती हैं" [ 4]।

BigQuery में पैरामीटरयुक्त क्वेरी चलाई जा सकती हैं, लेकिन तालिका नामों को पैरामीटराइज़ नहीं किया जा सकता [5]। आपका वाइल्डकार्ड समाधान ही एकमात्र रास्ता प्रतीत होता है।

2
Yurci 23 जुलाई 2018, 16:08
"अजीब सामान" एक स्कीमा परिवर्तन था जिसे अभी तक सभी तालिकाओं में प्रचारित नहीं किया गया था। उदा. mytable_2017 का स्कीमा पुराना है और mytable_2018 का स्कीमा नया है; अब आप वाइल्डकार्ड निर्माण का मज़बूती से उपयोग नहीं कर सकते।
 – 
Thomas
23 जुलाई 2018, 16:42
2
लेकिन हाँ, आपका लिंक निर्णायक रूप से मेरे प्रश्न का उत्तर देता है: "पैरामीटर का उपयोग इस रूप में नहीं किया जा सकता है पहचानकर्ता, स्तंभ नाम, तालिका नाम, या क्वेरी के अन्य भागों के लिए विकल्प।"
 – 
Thomas
23 जुलाई 2018, 16:43

यदि आप पायथन एपीआई का उपयोग करते हैं तो आप वास्तव में पैरामीटर के रूप में तालिकाओं का उपयोग कर सकते हैं, लेकिन यह अभी तक प्रलेखित नहीं है। यदि आप प्रारूपित पाठ स्ट्रिंग बनाम डॉकस्ट्रिंग के माध्यम से तालिकाओं को पैरामीटर के रूप में पास करते हैं, तो आपकी क्वेरी काम करेगी।

एसक्यूएल उदाहरण:

sql = "SELECT max(_last_updt) FROM `{0}.{1}.{2}` WHERE _last_updt >= TIMESTAMP(" +
    "CURRENT_DATE('-06:00'))".format(project_id, dataset_name, table_name)

पायथन एपीआई के संदर्भ में एसक्यूएल:

bigquery_client = bigquery.Client() #setup the client
query_job = bigquery_client.query(sql) #run the query
results = query_job.result() # waits for job to complete
for row in results:
    print row
-2
just_sung 18 फरवरी 2019, 18:12
3
मुझे संदेह है कि आप जो कर रहे हैं वह एसक्यूएल इंजेक्शन हमलों की संभावना को छोड़ देता है, क्योंकि प्रारूप फ़ंक्शन केवल तर्क के बिना स्ट्रिंग मैनिप्लेशंस कर रहा है जो SQL क्वेरी के उचित पैरामीटरकरण से आता है।
 – 
Nij
14 नवम्बर 2019, 19:05
यह सिर्फ स्ट्रिंग स्वरूपण है। BigQuery API से कोई लेना-देना नहीं है
 – 
Aaron
27 जिंदा 2020, 06:35
 – 
Buthetleon
12 मार्च 2020, 13:54

हाँ, आप कर सकते हैं, यहाँ एक कार्यशील उदाहरण है:

DECLARE tablename STRING;
DECLARE tableQuery STRING;

##get list of tables
CREATE TEMP TABLE tableNames as select table_name from nomo_nausea.INFORMATION_SCHEMA.TABLES where table_name not in ('_sdc_primary_keys', '_sdc_rejected', 'fba_all_order_report_data');

WHILE (select count(*) from tableNames) >= 1 DO
  SET tablename = (select table_name from tableNames LIMIT 1);
  ##build dataset + table name
  SET tableQuery = CONCAT('nomo_nausea.' , tablename);
  ##use concat to build string and execute
  EXECUTE IMMEDIATE CONCAT('SELECT * from `', tableQuery, '` where _sdc_deleted_at is not null');
  DELETE FROM tableNames where table_name = tablename;
END WHILE;
3
grantr 26 फरवरी 2021, 08:09
1
बहुत बढ़िया जवाब! स्क्रिप्टिंग नवंबर 2019 में BigQuery में जोड़ा, एक साल से अधिक समय से मैंने प्रश्न लिखा था, लेकिन आज यह एक अच्छा समाधान है।
 – 
Thomas
26 फरवरी 2021, 12:27