ऐडवांस: डेटासेट को सीधे तौर पर क्वेरी करना

Places Insights के डेटा को सीधे ऐक्सेस करने के लिए, BigQuery में एसक्यूएल क्वेरी लिखें. इससे, जगहों के बारे में एग्रीगेट की गई अहम जानकारी मिलती है. क्वेरी में बताई गई खोज की शर्तों के हिसाब से, डेटासेट से नतीजे मिलते हैं.

एग्रीगेशन थ्रेशोल्ड को समझना

रॉ टेबल पर सीधे तौर पर चलाई जाने वाली स्टैंडर्ड एसक्यूएल क्वेरी, एग्रीगेशन थ्रेशोल्ड को सख्ती से लागू करती हैं. आउटपुट के तौर पर एक पंक्ति सिर्फ़ तब जनरेट होती है, जब कैलकुलेट की गई एग्रीगेशन संख्या पांच या उससे ज़्यादा हो.

अगर आपकी क्वेरी के फ़िल्टर से 0, 1, 2, 3 या 4 की संख्या मिलती है, तो जवाब में नतीजों वाली पूरी पंक्ति शामिल नहीं की जाती. अगर आपके ऐप्लिकेशन लॉजिक के लिए, कम संख्या (शून्य भी शामिल है) की सटीक जानकारी चाहिए या जगहों के आईडी पाने की ज़रूरत है, तो आपको Places Count Functions का इस्तेमाल करके, डेटासेट की क्वेरी करनी होगी.

क्वेरी की बुनियादी बातें

यहां दी गई इमेज में, क्वेरी का बुनियादी फ़ॉर्मैट दिखाया गया है:

क्वेरी का सामान्य फ़ॉर्मैट.

क्वेरी के हर हिस्से के बारे में ज़्यादा जानकारी यहां दी गई है.

क्वेरी की ज़रूरी शर्तें

डेटासेट पर सीधे तौर पर की जाने वाली एसक्यूएल क्वेरी में, डेटासेट की जानकारी दी जानी चाहिए. साथ ही, SELECT क्लॉज़ में WITH AGGREGATION_THRESHOLD शामिल होना चाहिए. ऐसा न करने पर, क्वेरी काम नहीं करेगी.

इस उदाहरण में, अमेरिका के लिए डेटासेट की क्वेरी करने के लिए, places_insights___us.places की जानकारी दी गई है.

SELECT WITH AGGREGATION_THRESHOLD
COUNT(*) AS count
FROM `PROJECT_NAME.places_insights___us.places`

प्रोजेक्ट का नाम तय करना (ज़रूरी नहीं)

क्वेरी में, अपने प्रोजेक्ट का नाम शामिल किया जा सकता है. हालांकि, यह ज़रूरी नहीं है. अगर प्रोजेक्ट का नाम नहीं दिया जाता है, तो आपकी क्वेरी डिफ़ॉल्ट रूप से, चालू प्रोजेक्ट के लिए होती है.

अगर आपने अलग-अलग प्रोजेक्ट में एक ही नाम वाले डेटासेट लिंक किए हैं या अगर चालू प्रोजेक्ट के बाहर की किसी टेबल की क्वेरी की जा रही है, तो आपको अपने प्रोजेक्ट का नाम शामिल करना पड़ सकता है.

उदाहरण के लिए, [project name].[dataset name].places.

एग्रीगेशन फ़ंक्शन तय करना

यहां दिए गए उदाहरण में, BigQuery के समर्थित एग्रीगेशन फ़ंक्शन दिखाए गए हैं. इस क्वेरी में, न्यूयॉर्क शहर की एम्पायर स्टेट बिल्डिंग के 1,000 मीटर के दायरे में मौजूद सभी जगहों की रेटिंग को एग्रीगेट किया जाता है, ताकि रेटिंग के आंकड़े तैयार किए जा सकें:

SELECT WITH AGGREGATION_THRESHOLD
  COUNT(id) AS place_count,
  APPROX_COUNT_DISTINCT(rating) as distinct_ratings,
  COUNTIF(rating > 4.0) as good_rating_count,
  LOGICAL_AND(rating <= 5) as all_ratings_equal_or_below_five,
  LOGICAL_OR(rating = 5) as any_rating_exactly_five,
  AVG(rating) as avg_rating,
  SUM(user_rating_count) as rating_count,
  COVAR_POP(rating, user_rating_count) as rating_covar_pop,
  COVAR_SAMP(rating, user_rating_count) as rating_covar_samp,
  STDDEV_POP(rating) as rating_stddev_pop,
  STDDEV_SAMP(rating) as rating_stddev_samp,
  VAR_POP(rating) as rating_var_pop,
  VAR_SAMP(rating) as rating_var_samp,
FROM
  `PROJECT_NAME.places_insights___us.places`
WHERE
  ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000)
  AND business_status = "OPERATIONAL"

भौगोलिक पॉलीगॉन और लाइनों का इस्तेमाल करके नतीजे फ़िल्टर करना

अगर जगह से जुड़ी कोई पाबंदी तय नहीं की जाती है, तो डेटा एग्रीगेशन पूरे डेटासेट पर लागू होता है. आम तौर पर, किसी खास इलाके को खोजने के लिए, जगह से जुड़ी पाबंदी तय की जाती है.

1. रेडियल सर्च बफ़र (ST_DWITHIN) का इस्तेमाल करके फ़िल्टर करना

इस उदाहरण क्वेरी में, न्यूयॉर्क शहर की एम्पायर स्टेट बिल्डिंग को केंद्र मानकर, 1,000 मीटर के दायरे वाली टारगेट पाबंदी तय की गई है.

SELECT WITH AGGREGATION_THRESHOLD
COUNT(*) AS count
FROM `PROJECT_NAME.places_insights___us.places`
WHERE
ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000)

2. पॉलीगॉन की सीमाओं (ST_CONTAINS) का इस्तेमाल करके फ़िल्टर करना

खोज के लिए, पॉलीगॉन का इस्तेमाल किया जा सकता है. पॉलीगॉन का इस्तेमाल करते समय, पॉलीगॉन के पॉइंट से एक बंद लूप तय होना चाहिए. इसमें पॉलीगॉन का पहला पॉइंट, आखिरी पॉइंट के बराबर होना चाहिए:

SELECT WITH AGGREGATION_THRESHOLD
COUNT(*) AS count
FROM `PROJECT_NAME.places_insights___us.places`
WHERE
ST_CONTAINS(ST_GEOGFROMTEXT("""POLYGON((-73.985708 40.75773,-73.993324 40.750298,
                                      -73.9857 40.7484,-73.9785 40.7575,
                                      -73.985708 40.75773))"""), point)

3. रास्ते के ट्रैवल बफ़र (LINESTRING) के हिसाब से फ़िल्टर करना

अगले उदाहरण में, कनेक्ट किए गए पॉइंट की लाइन का इस्तेमाल करके, खोज का दायरा तय किया जाता है. साथ ही, लाइन के आस-पास 100 मीटर का खोज दायरा सेट किया जाता है. यह लाइन, Routes API से कैलकुलेट किए गए ट्रैवल रूट की तरह होती है. यह रूट, किसी वाहन, साइकल या पैदल चलने के लिए हो सकता है:

DECLARE route GEOGRAPHY;

SET route = ST_GEOGFROMTEXT("""LINESTRING(-73.98903537033028 40.73655649223003,
                                          -73.93580216278471 40.80955538843361)""");

SELECT WITH AGGREGATION_THRESHOLD
  COUNT(*) AS count
FROM `PROJECT_NAME.places_insights___us.places`
WHERE
  ST_DWITHIN(route, point, 100)

जगह के डेटासेट के फ़ील्ड के हिसाब से फ़िल्टर करना

डेटासेट स्कीमा में तय किए गए फ़ील्ड के आधार पर, अपनी खोज को बेहतर बनाएं. डेटासेट के फ़ील्ड के आधार पर नतीजे फ़िल्टर करें. जैसे, जगह की regular_opening_hours, price_level और ग्राहक की rating.

अपनी दिलचस्पी के देश के लिए, डेटासेट स्कीमा में तय किए गए किसी भी फ़ील्ड का रेफ़रंस दें. हर देश के लिए डेटासेट स्कीमा के दो हिस्से होते हैं:

उदाहरण के लिए, आपकी क्वेरी में WHERE क्लॉज़ शामिल हो सकता है. यह क्वेरी के लिए फ़िल्टर करने के मानदंड तय करता है.

यहां दिए गए उदाहरण में, tourist_attraction टाइप की जगहों के लिए एग्रीगेशन डेटा दिखाया गया है. इनका business_status, OPERATIONAL है. साथ ही, इनकी rating 4.0 या उससे ज़्यादा है. इसके अलावा, allows_dogs की वैल्यू true है:

SELECT WITH AGGREGATION_THRESHOLD
COUNT(*) AS count
FROM `PROJECT_NAME.places_insights___us.places`
WHERE
ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000)
AND 'tourist_attraction' IN UNNEST(types)
AND business_status = "OPERATIONAL"
AND rating >= 4.0
AND allows_dogs = true

अगली क्वेरी में, उन जगहों के नतीजे दिखाए जाते हैं जिनमें कम से कम आठ ईवी चार्जिंग स्टेशन हैं:

SELECT WITH AGGREGATION_THRESHOLD
  COUNT(*) AS count
FROM
  `PROJECT_NAME.places_insights___us.places`
WHERE
  ev_charge_options.connector_count > 8;

जगह के मुख्य टाइप और जगह के टाइप के हिसाब से फ़िल्टर करना

डेटासेट में मौजूद हर जगह के लिए:

  • एक मुख्य टाइप हो सकता है. यह Place types में तय किए गए टाइप में से कोई एक होता है. उदाहरण के लिए, मुख्य टाइप mexican_restaurant या steak_house हो सकता है. किसी जगह के मुख्य टाइप के आधार पर नतीजों को फ़िल्टर करने के लिए, क्वेरी में primary_type का इस्तेमाल करें.
  • कई टाइप की वैल्यू हो सकती हैं. ये Place types में तय किए गए टाइप में से कोई भी हो सकती हैं. उदाहरण के लिए, किसी रेस्टोरेंट के ये टाइप हो सकते हैं: seafood_restaurant, restaurant, food, point_of_interest, establishment. जगह से जुड़े टाइप की सूची के आधार पर नतीजों को फ़िल्टर करने के लिए, क्वेरी में types का इस्तेमाल करें.

यहां दी गई क्वेरी में, skin_care_clinic के मुख्य टाइप वाली उन सभी जगहों के नतीजे दिखाए जाते हैं जो spa के तौर पर भी काम करती हैं:

SELECT WITH AGGREGATION_THRESHOLD
  COUNT(*) AS count
FROM
  `PROJECT_NAME.places_insights___us.places`
WHERE
  'spa' IN UNNEST(types)
  AND 'skin_care_clinic' = primary_type

जगह के आईडी के हिसाब से फ़िल्टर करना

यहां दिए गए उदाहरण में, पांच जगहों की औसत रेटिंग कैलकुलेट की गई है. इन जगहों की पहचान, इनके place_id से होती है.

DECLARE place_ids ARRAY<STRING>;
SET place_ids = ['ChIJPQOh8YVZwokRE2WsbZI4tOk', 'ChIJibtT3ohZwokR7tX0gp0nG8U',
                 'ChIJdfD8moVZwokRO6vxjXAtoWs', 'ChIJsdNONuFbwokRLM-yuifjb8k',
                 'ChIJp0gKoClawokR0txqrcaEkFc'];
SELECT WITH AGGREGATION_THRESHOLD
 AVG(rating) as avg_rating,
FROM
  `<var>PROJECT_NAME</var>.places_insights___us.places`,
  UNNEST(place_ids) place_id
WHERE
  id = place_id;

क्वेरी के नतीजों से, जगह के कुछ खास आईडी बाहर रखना

क्वेरी से, जगह के आईडी की कोई कलेक्शन भी बाहर रखी जा सकती है.

Place ID finder का इस्तेमाल करके या प्रोग्राम के हिसाब से, अपने-आप होने वाली प्रोसेस के ज़रिए Places API का इस्तेमाल करके, टेक्स्ट से खोजें (नया) का अनुरोध करके, अपनी ज़रूरत के हिसाब से जगह के आईडी ढूंढे जा सकते हैं.

यहां दिए गए उदाहरण में, क्वेरी में सिडनी, ऑस्ट्रेलिया के 2000 पिन कोड में मौजूद उन कैफ़े की संख्या पता की जाती है जो शामिल नहीं हैं excluded_cafes कलेक्शन में. इस तरह की क्वेरी, किसी कारोबार के मालिक के लिए काम की हो सकती है. ऐसा इसलिए, क्योंकि वह अपने कारोबारों को संख्या से बाहर रखना चाहेगा.

WITH excluded_cafes AS (
  -- List the specific place IDs to exclude from the final count
  SELECT * FROM UNNEST([
    'ChIJLTcYGz-uEmsRmazk9oMnP5w', 'ChIJeWDDDNOvEmsRF8SMPUwPbhw',
    'ChIJKdaKHbmvEmsRSdxq_1O05bU'
  ]) AS place_id
)

SELECT WITH AGGREGATION_THRESHOLD
  COUNT(*) AS count
FROM
  `places_insights___au.places` AS places
-- Perform a LEFT JOIN to identify which places are in the exclusion list
LEFT JOIN
  excluded_cafes ON places.id = excluded_cafes.place_id
WHERE
  -- Filter for specific place type and postal code
  places.primary_type = 'cafe'
  AND '2000' IN UNNEST(places.postal_code_names)
  -- Keep only the rows where the join failed (meaning the ID was NOT in the list)
  AND excluded_cafes.place_id IS NULL;

तय की गई डेटा वैल्यू के हिसाब से फ़िल्टर करना

डेटासेट के कई फ़ील्ड में, पहले से तय की गई वैल्यू होती हैं. उदाहरण के लिए:

  • price_level फ़ील्ड में, पहले से तय की गई ये वैल्यू इस्तेमाल की जा सकती हैं:
    • PRICE_LEVEL_FREE
    • PRICE_LEVEL_INEXPENSIVE
    • PRICE_LEVEL_MODERATE
    • PRICE_LEVEL_EXPENSIVE
    • PRICE_LEVEL_VERY_EXPENSIVE
  • business_status फ़ील्ड में, पहले से तय की गई ये वैल्यू इस्तेमाल की जा सकती हैं:
    • OPERATIONAL
    • CLOSED_TEMPORARILY
    • CLOSED_PERMANENTLY
    • FUTURE_OPENING

इस उदाहरण में, क्वेरी में न्यूयॉर्क शहर की एम्पायर स्टेट बिल्डिंग के 1,000 मीटर के दायरे में मौजूद उन सभी फ़्लोरिस्ट की संख्या दिखाई गई है जिनका business_status, OPERATIONAL है:

SELECT WITH AGGREGATION_THRESHOLD
COUNT(*) AS count
FROM `PROJECT_NAME.places_insights___us.places`
WHERE
ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000)
AND business_status = "OPERATIONAL"
AND 'florist' IN UNNEST(types)

कामकाज के घंटों के हिसाब से फ़िल्टर करना

इस उदाहरण में, किसी भौगोलिक इलाके में मौजूद उन सभी जगहों की संख्या दिखाई गई है जहां शुक्रवार को हैप्पी आवर होता है:

SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count
FROM `PROJECT_NAME.places_insights___us.places`,
UNNEST(regular_opening_hours_happy_hour.friday) AS friday_hours
WHERE '17:00:00' BETWEEN friday_hours.start_time AND friday_hours.end_time
AND ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000);

इलाके के हिसाब से फ़िल्टर करना (पते के कॉम्पोनेंट)

हमारे जगहों के डेटासेट में, पते के कॉम्पोनेंट का एक सेट भी शामिल है. यह राजनीतिक सीमाओं के आधार पर नतीजों को फ़िल्टर करने के लिए काम का है. पते के हर कॉम्पोनेंट की पहचान, उसके टेक्स्ट कोड नेम (एनवाईसी के पिन कोड के लिए 10002) या मिलते-जुलते पिन कोड आईडी के लिए जगह के आईडी (ChIJm5NfgIBZwokR6jLqucW0ipg) से होती है.

SELECT WITH AGGREGATION_THRESHOLD
  COUNT(*) AS count
FROM
  `PROJECT_NAME.places_insights___us.places`
WHERE
  '10002' IN UNNEST(postal_code_names)
  -- 'ChIJm5NfgIBZwokR6jLqucW0ipg' IN UNNEST(postal_code_ids) -- same filter as above using postal code ID

ईवी चार्जिंग कॉन्फ़िगरेशन के हिसाब से फ़िल्टर करना

इस उदाहरण में, उन जगहों की संख्या दिखाई गई है जहां कम से कम आठ ईवी चार्जर हैं:

SELECT WITH AGGREGATION_THRESHOLD
  COUNT(*) AS count
FROM
  `PROJECT_NAME.places_insights___us.places`
WHERE
  ev_charge_options.connector_count > 8;

इस उदाहरण में, उन जगहों की संख्या दिखाई गई है जहां कम से कम 10 टेस्ला चार्जर हैं. इनमें फ़ास्ट चार्जिंग की सुविधा है:

SELECT WITH AGGREGATION_THRESHOLD
  COUNT(*) AS count
FROM
  `PROJECT_NAME.places_insights___us.places`, UNNEST(ev_charge_options.connector_aggregation) as connectors
WHERE
  connectors.type ='EV_CONNECTOR_TYPE_TESLA'
  AND connectors.max_charge_rate_kw >= 50
  AND connectors.count >= 10

ग्रुप की गई नतीजों वाली पंक्तियां दिखाना

अब तक दिखाई गई क्वेरी के नतीजों में, एक पंक्ति दिखती है. इसमें क्वेरी के लिए एग्रीगेशन की संख्या होती है. ग्रुपिंग के मानदंड के आधार पर, जवाब में कई पंक्तियां दिखाने के लिए, GROUP BY ऑपरेटर का भी इस्तेमाल किया जा सकता है.

उदाहरण के लिए, यहां दी गई क्वेरी में, खोज के दायरे में मौजूद हर जगह के मुख्य टाइप के हिसाब से ग्रुप किए गए नतीजे दिखाए गए हैं:

SELECT WITH AGGREGATION_THRESHOLD
  primary_type,
  COUNT(*) AS count
FROM
  `PROJECT_NAME.places_insights___us.places`
WHERE
  ST_DWITHIN(ST_GEOGPOINT(-73.99992071622756, 40.71818785986936), point, 1000)
GROUP BY primary_type

इस इमेज में, इस क्वेरी का एक उदाहरण आउटपुट दिखाया गया है:

नतीजों को मुख्य टाइप के हिसाब से ग्रुप करने के लिए क्वेरी के नतीजे.

इस उदाहरण में, जगहों की एक टेबल तय की गई है. इसके बाद, हर जगह के लिए आस-पास मौजूद रेस्टोरेंट की संख्या कैलकुलेट की गई है. इसका मतलब है कि 1,000 मीटर के दायरे में मौजूद रेस्टोरेंट:

WITH my_locations AS (
  SELECT 'Location 1' AS name, ST_GEOGPOINT(-74.00776440888504, 40.70932825380786) AS location
  UNION ALL
  SELECT 'Location 2' AS name, ST_GEOGPOINT(-73.98257192833559, 40.750738934863215) AS location
  UNION ALL
  SELECT 'Location 3' AS name, ST_GEOGPOINT(-73.94701794263223, 40.80792954838445)  AS location
)
SELECT WITH AGGREGATION_THRESHOLD
  l.name,
  COUNT(*) as count
FROM
  `PROJECT_NAME.places_insights___us.places` AS p
JOIN
   my_locations l
ON
  ST_DWITHIN(l.location, p.point, 1000)
WHERE
  primary_type = "restaurant"
  AND business_status = "OPERATIONAL"
GROUP BY
  l.name

इस इमेज में, इस क्वेरी का एक उदाहरण आउटपुट दिखाया गया है:

जगह के हिसाब से नतीजों को ग्रुप करने के लिए क्वेरी के नतीजे.