"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > Bigquery की पैरामीटरयुक्त क्वेरीज़ में स्ट्रक्चर्स की एक सरणी कैसे पास करें

Bigquery की पैरामीटरयुक्त क्वेरीज़ में स्ट्रक्चर्स की एक सरणी कैसे पास करें

2024-11-08 को प्रकाशित
ब्राउज़ करें:979

How to pass an Array of Structs in Bigquery

Google की Bigquery में, SQL क्वेरी को पैरामीटरयुक्त किया जा सकता है। यदि आप इस अवधारणा से परिचित नहीं हैं, तो मूल रूप से इसका मतलब है कि आप SQL क्वेरी को इस तरह पैरामीटरयुक्त टेम्पलेट के रूप में लिख सकते हैं:

INSERT INTO mydataset.mytable(columnA, columnB)
    VALUES (@valueA, @valueB)

और मानों को अलग से पास करें। इसके कई फायदे हैं:

  • स्ट्रिंग संयोजन द्वारा बनाई गई क्वेरी की तुलना में क्वेरी अधिक पठनीय है
  • कोड अधिक मजबूत और औद्योगिकीकृत है
  • यह एसक्यूएल इंजेक्शन हमलों (अनिवार्य XKCD) के खिलाफ एक महान सुरक्षा है

पायथन स्क्रिप्ट से क्वेरी पैरामीटर पास करना पहली नजर में सीधा प्रतीत होता है। उदाहरण के लिए:

from google.cloud.bigquery import (
    Client,
    ScalarQueryParameter,
    ArrayQueryParameter,
    StructQueryParameter,
    QueryJobConfig,
)

client=Client()

client.query("
INSERT INTO mydataset.mytable(columnA, columnB)
    VALUES (@valueA, @valueB)
", job_config=QueryJobConfig(
    query_parameters=[
        ScalarQueryParameter("valueA","STRING","A"), 
        ScalarQueryParameter("valueB","STRING","B")
])

ऊपर दिया गया उदाहरण कॉलम ए और बी में सरल ("स्केलर") मान सम्मिलित करता है। लेकिन आप अधिक जटिल पैरामीटर भी पास कर सकते हैं:

  • सरणी (ArrayQueryParameter)
  • स्ट्रक्चर्स (स्ट्रक्चरक्वेरीपैरामीटर)

समस्याएं तब उत्पन्न होती हैं जब आप संरचनाओं की सारणी सम्मिलित करना चाहते हैं: वेब पर इस विषय पर कई गठजोड़, लगभग कोई दस्तावेज नहीं और बहुत कम संसाधन हैं। इस लेख का लक्ष्य इस अंतर को भरना है।

पैरामीटरयुक्त प्रश्नों का उपयोग करके bigquery में structs की एक सरणी को कैसे बनाए रखें

आइए निम्नलिखित ऑब्जेक्ट को परिभाषित करें जिसे हम अपनी गंतव्य तालिका में संग्रहीत करना चाहते हैं

from dataclasses import dataclass

@dataclass
class Country:
    name: str
    capital_city: str

@dataclass
class Continent:
    name: str
    countries: list[Country]

इस पैरामीटरयुक्त क्वेरी को लागू करके

query = UPDATE continents SET countries=@countries WHERE name="Oceania"

उथले दस्तावेज़ का पालन करके पहला प्रयास होगा

client.query(query, 
    job_config=QueryJobConfig(query_parameters=[
        ArrayQueryParameter("countries", "RECORD", [
             {name="New Zealand", capital_city="Wellington"},
             {name="Fiji", capital_city="Suva"} ...]
]))

जो बुरी तरह विफल हो जाएगा

AttributeError: 'dict' ऑब्जेक्ट में कोई विशेषता नहीं है 'to_api_repr'

समझ गया n°1: ArrayQueryParameter के मान StructQueryParameter के उदाहरण होने चाहिए

यह पता चलता है कि कंस्ट्रक्टर का तीसरा तर्क - मान- स्ट्रक्चरक्वेरी पैरामीटर उदाहरणों का संग्रह होना चाहिए, न कि सीधे वांछित मान। तो आइए उनका निर्माण करें:

client.query(query, 
job_config=QueryJobConfig(query_parameters=[
    ArrayQueryParameter("countries", "RECORD", [
    StructQueryParameter("countries",
        ScalarQueryParameter("name", "STRING", ct.name), 
        ScalarQueryParameter("capital_city", "STRING", ct.capital_city)
    )
    for ct in countries])
]))

इस बार यह काम करता है... जब तक आप एक खाली सरणी सेट करने का प्रयास नहीं करते

client.query(query, 
    job_config=QueryJobConfig(
    query_parameters=[
        ArrayQueryParameter("countries", "RECORD", [])
]))

ValueError: एक खाली सरणी के लिए विस्तृत संरचना आइटम प्रकार की जानकारी गुम है, कृपया एक structQueryParameterType उदाहरण प्रदान करें।

समझ गया n°2: दूसरे तर्क के रूप में पूर्ण संरचना प्रकार प्रदान करें

त्रुटि संदेश बिल्कुल स्पष्ट है: "रिकॉर्ड" बिगक्वेरी के लिए यह जानने के लिए पर्याप्त नहीं है कि आपके खाली सरणी के साथ क्या करना है। इसके लिए पूर्ण विस्तृत संरचना की आवश्यकता है। ऐसा ही हो

client.query(query, job_config=QueryJobConfig(query_parameters=[
    ArrayQueryParameter("countries",
        StructQueryParameterType(
            ScalarQueryParameterType("STRING","name"),
            ScalarQueryParameterType("STRING","capital_city")
        ), [])
]))

(ध्यान दें कि ...पैरामीटर टाइप कंस्ट्रक्टर के तर्कों का क्रम ...पैरामीटर कंस्ट्रक्टर के विपरीत है। सड़क पर बस एक और जाल...)

और अब यह खाली सरणियों के लिए भी काम करता है, वाह!

जानने लायक एक आखिरी बात: StructQueryParameterType के प्रत्येक उपक्षेत्र का एक नाम होना चाहिए, भले ही कंस्ट्रक्टर में दूसरा पैरामीटर (नाम) वैकल्पिक हो। यह वास्तव में उपक्षेत्रों के लिए अनिवार्य है, अन्यथा आपको एक नई प्रकार की त्रुटि मिलेगी

खाली संरचना फ़ील्ड नाम

मुझे लगता है कि क्वेरी पैरामीटर्स में रिकॉर्ड्स की सरणियों के उपयोग को पूरा करने के लिए हमें बस इतना ही जानना आवश्यक है, मुझे आशा है कि इससे मदद मिलेगी!


पढ़ने के लिए धन्यवाद! मैं मैथ्यू हूं, स्टैक लैब्स में डेटा इंजीनियर।
यदि आप स्टैक लैब्स डेटा प्लेटफ़ॉर्म की खोज करना चाहते हैं या उत्साही डेटा इंजीनियरिंग टीम में शामिल होना चाहते हैं, तो कृपया हमसे संपर्क करें।


फोटो डे डेनिस नेवोझाई सुर अनस्प्लैश

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/stack-labs/how-to-pass-an-array-of-structs-in-bigquerys-parameterized-queries-39nm?1 यदि कोई उल्लंघन है, तो कृपया स्टडी_गोलंग@163 .comडिलीट से संपर्क करें
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3