Іноді я хочу протестувати певні функції BQ та оператори sql у консолі BQ без створення тестової таблиці в моєму наборі даних. Наприклад, я можу протестувати regexp_match у консолі за допомогою цього:
Select Regexp_extract(StringToParse,r"b(à)b") as Extract,
Regexp_match(StringToParse,r"b(à)b") as match,
FROM
(SELECT "Voilà la séance qui est à Paris." as StringToParse)
Я хотів би зробити те саме, використовуючи повні таблиці, подані, можливо, як рядок json.
Наприклад, якщо у мене є тестова таблиця з двома записами:
[
{"rowNumber":1,
"index": [1,2,3]
},
{"rowNumber":2,
"index": [2,7,8,15]
}
]
Чи можу я передати цю таблицю для тестування BQ sql? Щось на зразок:
Select max(index) as max from parse("long json string")....
Я усвідомлюю, що наведеної схеми не існує, тому настільний столик, мабуть, неможливий.
Схема буде наступною (ну, з "рядком", де я маю "запис" для масиву цілих чисел, мабуть - це такий тип речей, який я хочу перевірити):
[
{
"name":"rowNumber",
"type":"integer"
},
{
"name": "index"
"type": "record" (oops, can"t put an array of integers here...)
},
]
Відповіді:
1 для відповіді № 1Примітка: Я відповідаю на питання - I sometimes want to test certain BQ functions and sql statements in the BQ console without creating a test table in my dataset
Я бачу кілька випадків (може бути і більше, але принаймні три нижче можуть створити для вас хороший старт)
Випадок №1 - Супер простий - поля поля запису не задіяні
Приклад:
SELECT a, b, c, d
FROM
(SELECT 1 AS a, "x" AS b, "Voilà la séance qui est à Paris." AS c, "[{"rowNumber":1,"index": [1,2,3]},{"rowNumber":2,"index": [2,7,8,15]}]" AS d),
(SELECT 2 AS a, "y" AS b, "That session is in Paris." AS c, "[{"rowNumber":3,"index": [4,5]},{"rowNumber":4,"index": [20, 23, 39]}]" AS d),
(SELECT 3 AS a, "z" AS b, "Эта сессия в Париже." AS c, "[{"rowNumber":5,"index": [6,7,8,9]},{"rowNumber":6,"index": [15, 45]}]" AS d)
Отже, тепер ви можете використовувати цю «віртуальну» таблицю, щоб експериментувати зі своїм кодом, як показано нижче
SELECT
a, b,
REGEXP_EXTRACT(c, r"(à)") AS extract,
REGEXP_MATCH(c, r"(à)") AS match,
JSON_EXTRACT(d, "$[1].index[0]") AS index
FROM (
SELECT a, b, c, d
FROM
(SELECT 1 AS a, "x" AS b, "Voilà la séance qui est à Paris." AS c, "[{"rowNumber":1,"index": [1,2,3]},{"rowNumber":2,"index": [2,7,8,15]}]" AS d),
(SELECT 2 AS a, "y" AS b, "That session is in Paris." AS c, "[{"rowNumber":3,"index": [4,5]},{"rowNumber":4,"index": [20, 23, 39]}]" AS d),
(SELECT 3 AS a, "z" AS b, "Эта сессия в Париже." AS c, "[{"rowNumber":5,"index": [6,7,8,9]},{"rowNumber":6,"index": [15, 45]}]" AS d)
)
Випадок №2 - простий із записом
Якщо у вас є запис лише з одним вкладеним полем - нижче це робиться
SELECT rowNumber, NEST(index) AS index
FROM
(SELECT 1 AS rowNumber, 1 AS index),
(SELECT 1 AS rowNumber, 2 AS index),
(SELECT 1 AS rowNumber, 3 AS index),
(SELECT 2 AS rowNumber, 2 AS index),
(SELECT 2 AS rowNumber, 3 AS index),
(SELECT 2 AS rowNumber, 8 AS index),
(SELECT 2 AS rowNumber, 15 AS index)
GROUP BY rowNumber
Ви можете використовувати це як заміну у своїх експериментах із “простим” полем запису До речі, щоб підтвердити собі, що це насправді два рядки, а не 7 - виконайте нижче:
SELECT COUNT(1) AS rows FROM (
SELECT rowNumber, NEST(index) AS index
FROM
(SELECT 1 AS rowNumber, 1 AS index),
(SELECT 1 AS rowNumber, 2 AS index),
(SELECT 1 AS rowNumber, 3 AS index),
(SELECT 2 AS rowNumber, 2 AS index),
(SELECT 2 AS rowNumber, 3 AS index),
(SELECT 2 AS rowNumber, 8 AS index),
(SELECT 2 AS rowNumber, 15 AS index)
GROUP BY rowNumber
)
Випадок №3 - Схема із записом довільної складності, як у прикладі у вашому запитанні
Якщо ви хочете мати довільну схему для експериментів, вам слід спочатку трохи поекспериментувати з тим, як створити такі схеми в GBQ за допомогою JS UDF. Перегляньте приклади нижче
Створіть таблицю зі стовпцем Тип запису
створити таблицю із типом стовпця ЗАПИС
Після того, як ви його освоїте - ви можете імітувати будь-яку таблицю будь-якої складності в GBQ і використовувати її як підвибір (замість реальної таблиці) для експериментів з функціональністю GBQ
1 для відповіді № 2
На основі ваших прикладів даних, потрібною вам схемою виводу є:
[
{
"name":"rowNumber",
"type":"integer"
},
{
"name": "index",
"type": "integer",
"mode": "repeated"
},
]
Ось щось, що буде працювати на вашому прикладі, знаходячи MAX
кожного індексу. "ВИБЕРИТИ НУЛЬ" у внутрішній частині SELECT
на жаль, але BigQuery скаржиться на використання SPLIT
без a FROM
пост.
SELECT rowNumber, MAX(index) AS max_index FROM
(SELECT 1 AS rowNumber, INTEGER(SPLIT("1,2,3")) AS index FROM (SELECT NULL)),
(SELECT 2 AS rowNumber, INTEGER(SPLIT("2,7,8,15")) AS index FROM (SELECT NULL))
GROUP BY rowNumber
Якщо ви шукаєте спосіб зробити це загалом для JSON, ви можете дослідити, використовуючи Функції JSON у посиланні на запит.
Я не зміг отримати ваш точний прикладз цими функціями, але залежно від вашої структури JSONPath-fu / JSON, ви можете отримати щось робоче. Це, наприклад, захоплює значення в першому рядку. Однак зауважте, що висновок є строковим, тому ви отримуєте рядок "[1,2,3]", але ви, можливо, можете проаналізувати його в потрібний формат за допомогою деяких рядкових функцій SPLIT
.
SELECT
JSON_EXTRACT(input, "$[0].rowNumber") as rowNumber,
JSON_EXTRACT(input, "$[0].index") as index
FROM
(SELECT "[
{"rowNumber":1,
"index": [1,2,3]
},
{"rowNumber":2,
"index": [2,7,8,15]
}
]" as input);
0 для відповіді № 3
Я впевнений, що BigQuery підтримує такий синтаксис:
select *
from (select "a" as cola, 1 as col1) a,
(select "b", 2) b;
Тобто ви можете визначити таблицю за допомогою select
і union all
для визначення "таблиці" у запиті.