/ / Чи може ціла таблиця (як рядок) бути включена в оператор sql для bigquery? - sql, google-bigquery

Чи може вся таблиця (як рядок) бути включена в оператор sql для bigquery? - sql, google-bigquery

Іноді я хочу протестувати певні функції 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 для визначення "таблиці" у запиті.