2015-02-25 9 views
7

मेरे पास BigQuery में एक डेटासेट है। इस डेटासेट में कई टेबल हैं।BigQuery - जांचें कि तालिका पहले से मौजूद है

मैं निम्नलिखित चरणों का प्रोग्राम के रूप में BigQuery API का उपयोग कर कर रहा हूँ:

  1. डाटासेट में तालिकाओं का पता कर रहा - के बाद से मेरी प्रतिक्रिया बहुत बड़ा है, मैं allowLargeResults पैरामीटर को सक्षम करने कर रहा हूँ और एक गंतव्य मेज पर मेरी प्रतिक्रिया डाइवर्ट ।

  2. मैं फिर गंतव्य तालिका से डेटा को जीसीएस बाल्टी में निर्यात कर रहा हूं।

आवश्यकताएँ:

  • मान लीजिए मेरा प्रक्रिया चरण 2 में विफल रहता है, मैं इस कदम फिर से चलाने के लिए चाहते हैं।

  • लेकिन मैं फिर से चलाने से पहले, मैं जांचना/सत्यापित करना चाहता हूं कि 'xyz' नाम की विशिष्ट गंतव्य तालिका पहले से ही डेटासेट में मौजूद है।

  • अगर यह मौजूद है, मैं चाहते हैं 2.

  • फिर से चलाने के कदम अगर यह मौजूद नहीं है, मैं होता foo करना पसंद।

मैं यह कैसे कर सकता हूं?

अग्रिम धन्यवाद।

+0

क्या आपने कभी लिखने की तैयारी में देखा है? आप वास्तव में "write_if_empty" नामक कुछ कर सकते हैं, जो तालिका पर कोई भी डेटा होने पर ब्लॉक करता है। या "Write_truncate" जो मौजूदा डेटा को आपके वर्तमान के साथ बदल देगा। – Patrice

+0

मैंने इसे देखा। मैं यह जांचना चाहता हूं कि जीसीएस को निर्यात करने से पहले तालिका मौजूद है .. गंतव्य तालिका में लिखने से पहले नहीं। लिखने के स्वभाव पैरामीटर केवल तब उपलब्ध होते हैं जब आप किसी तालिका में डेटा लोड करना चाहते हैं, तालिका से पूछें और मौजूदा तालिका की प्रतिलिपि बनाएँ। लेकिन जीसीएस को निकालने के दौरान नहीं। यह मेरी समझ थी। शायद मैं गलत हो सकता हूँ। कोई विचार? – activelearner

+0

नहीं, नहीं, आप बिल्कुल सही हैं। आपका प्रश्न बहुत व्यापक लग रहा था, इसलिए मुझे 100% यकीन नहीं था कि आप समस्या को पकड़ना चाहते थे। खैर मेरा मतलब है .... आप किस भाषा का उपयोग कर रहे हैं? : पी हमें इस प्रश्न को देखने में सक्षम होने के लिए कुछ मांस चाहिए। BigQuery API के साथ निश्चित रूप से एक तरीका मौजूद है कि कोई तालिका मौजूद है ... – Patrice

उत्तर

7

यहाँ एक अजगर टुकड़ा बता देगा कि क्या एक मेज मौजूद है:

def doesTableExist(project_id, dataset_id, table_id): 
    bq.tables().delete(
     projectId=project_id, 
     datasetId=dataset_id, 
     tableId=table_id).execute() 
    return False 

वैकल्पिक रूप से, अगर आप इस प्रक्रिया में तालिका को हटाने नहीं करना चाहते तो आज़मा सकते हैं:

def doesTableExist(project_id, dataset_id, table_id): 
    try: 
    bq.tables().get(
     projectId=project_id, 
     datasetId=dataset_id, 
     tableId=table_id).execute() 
    return True 
    except HttpError, err 
    if err.resp.status <> 404: 
     raise 
    return False 

यदि आप जानना चाहते हैं कि bq कहां से आया है, तो आप यहां से build_bq_client पर कॉल कर सकते हैं: http://code.google.com/p/bigquery-e2e/source/browse/samples/ch12/auth.py

सामान्य रूप से, यदि आप टी का उपयोग कर रहे हैं यह जांचने के लिए कि क्या आपको नौकरी चलाने की ज़रूरत है जो तालिका को संशोधित करेगी, वैसे भी नौकरी करने के लिए एक अच्छा विचार हो सकता है, और लिखने के स्वभाव के रूप में WRITE_TRUNCATE का उपयोग करें।

एक और दृष्टिकोण एक अनुमानित नौकरी आईडी बनाने और उस आईडी के साथ नौकरी पुनः प्रयास करने के लिए हो सकता है। यदि नौकरी पहले से मौजूद है, तो नौकरी पहले से ही चल रही है (हालांकि आप यह सुनिश्चित करने के लिए दोबारा जांच करना चाहेंगे कि नौकरी विफल नहीं हुई है)।

+0

धन्यवाद जॉर्डन। मैं वैध क्रेडेंशियल्स से सफलतापूर्वक बीक क्लाइंट ऑब्जेक्ट बनाने में सक्षम था। बीक का उपयोग करके, मैं doTableExist फ़ंक्शन को कार्यान्वित करने में सक्षम था। – activelearner

+0

404 का अर्थ यह भी हो सकता है कि संसाधन कारणों के समूह के लिए नहीं है, जबकि उपयोगकर्ता को लगता है कि तालिका बस मौजूद नहीं है। अब काम करता है शायद। "काम करने" के एन वर्षों के बाद त्रुटि को खोजने की कोशिश करें। –

+0

यदि आपके पास पहले से ही एक त्वरित ग्राहक है, तो '.exists()' विधि है। Https://stackoverflow.com/a/47884257/92471 –

1

आनंद लें:

def doesTableExist(bigquery, project_id, dataset_id, table_id): 
    try: 
     bigquery.tables().get(
      projectId=project_id, 
      datasetId=dataset_id, 
      tableId=table_id).execute() 
     return True 
    except Exception as err: 
     if err.resp.status != 404: 
      raise 
     return False 

अपवाद में संपादित नहीं है।my_bigquery वर्ग google.cloud.bigquery.Client का एक उदाहरण जा रहा है

0

(पहले से ही authentified और एक परियोजना से जुड़े):

my_bigquery.dataset(dataset_name).table(table_name).exists() # returns boolean 

यह GET अनुरोध

के माध्यम से मेज के अस्तित्व के लिए परीक्षण करने के लिए एक API कॉल करता है स्रोत: https://googlecloudplatform.github.io/google-cloud-python/0.24.0/bigquery-table.html#google.cloud.bigquery.table.Table.exists

यह मेरे Google बिगक्वेरी पायथन मॉड्यूल के 0.27 उपयोग करने के लिए काम करता है

+1

पर मेरा उत्तर देखें यह google-cloud-bigquery == 0.28 के लिए टूटा हुआ है –

0

एलेक्स एफ का समाधान v0.27 पर काम करता है, लेकिन बाद के संस्करणों पर काम नहीं करेगा। migrate to v0.28+ के लिए, नीचे दिया गया समाधान काम करेगा।

from google.cloud import bigquery 

project_nm = 'gc_project_nm' 
dataset_nm = 'ds_nm' 
table_nm = 'tbl_nm' 

client = bigquery.Client(project_nm) 
dataset = client.dataset(dataset_nm) 
table_ref = dataset.table(table_nm) 

def if_tbl_exists(client, table_ref): 
    from google.cloud.exceptions import NotFound 
    try: 
     client.get_table(table_ref) 
     return True 
    except NotFound: 
     return False 

if_tbl_exists(client, table_ref) 
संबंधित मुद्दे