Красивая таблица значений печати из BigQuery Standard SQL соединенных таблиц с использованием bq на CLI? - PullRequest
0 голосов
/ 12 февраля 2020

Можно ли как-нибудь отформатировать результирующие наборы "таблицы значений" для Big Query с помощью инструмента командной строки bq, используя Standard SQL? Это работает, как и ожидалось, в консоли BigQuery со стандартом SQL, но не в bq. Я не могу найти удобный обходной путь. Он также работает, как и ожидалось, используя Legacy SQL.

Мой пример использования: я изучаю таблицы с большим количеством столбцов в BigQuery. Анонимные запросы в BigQuery требуют, чтобы выбранные столбцы имели уникальное имя, в противном случае вы получите сообщение «Дублирующиеся имена столбцов в результате не поддерживаются. Найдено дубликатов: ...». Это очень строгое требование, когда я просто изучаю данные. К счастью, в веб-консоли BigQuery есть способ обойти это, используя таблицы значений в выражении выбора ...

with
left_side as
(
select 1 as id, 'hello' as col1 union all 
select 2 as id, 'there' as col1
)
,right_side as
(
select 1 as id, 'hello' as col1 union all 
select 2 as id, 'world' as col1
)
select a, b
  from left_side a
       join
       right_side b
          on a.id = b.id

..., что приводит к следующему табличному набору результатов с автоматически перечисляемыми столбцами, которые отлично ...

tabular result set

Однако тот же запрос при передаче в bq в командной строке выглядит следующим образом (через документ здесь для вашего удобство). Обычно у меня есть запрос в файле, и я перенаправляю его в bq, например, bq query --use_legacy_sql=false < bq_test4.sql

bq query --use_legacy_sql=false <<BQ_TEST
with
left_side as
(
select 1 as id, 'hello' as col1 union all 
select 2 as id, 'there' as col1
)
,right_side as
(
select 1 as id, 'hello' as col1 union all 
select 2 as id, 'world' as col1
)
select a, b
  from left_side a
       join
       right_side b
          on a.id = b.id
BQ_TEST

... приводит к тому же самому основному набору результатов независимо от переданных опций --format на bq ...

+---------------------------+---------------------------+
|             a             |             b             |
+---------------------------+---------------------------+
| {"id":"1","col1":"hello"} | {"id":"1","col1":"hello"} |
| {"id":"2","col1":"there"} | {"id":"2","col1":"world"} |
+---------------------------+---------------------------+

Такой набор результатов мне не поможет.

Хорошо, я могу преобразовать json в табличный набор результатов с помощью ...

with
left_side as
(
select 1 as id, 'hello' as col1 union all 
select 2 as id, 'there' as col1
)
,right_side as
(
select 1 as id, 'hello' as col1 union all 
select 2 as id, 'world' as col1
)
select json_extract_scalar(to_json_string(a), "$['id']") as `a_id`
      ,json_extract_scalar(to_json_string(a), "$['col1']") as `a_col1`
      ,json_extract_scalar(to_json_string(b), "$['id']") as `b_id`
      ,json_extract_scalar(to_json_string(b), "$['col1']") as `b_col1`
  from left_side a
       join
       right_side b
          on a.id = b.id

..., что приведет к получению Legacy SQL ...

+------+--------+------+--------+
| a_id | a_col1 | b_id | b_col1 |
+------+--------+------+--------+
| 1    | hello  | 1    | hello  |
| 2    | there  | 2    | world  |
+------+--------+------+--------+

Необходимость перечисления столбцов противоречит цели моего варианта использования.

Есть ли какой-либо способ, при использовании Standard SQL, избегать перечисления столбцов до в мое присоединение или после моего присоединения?

1 Ответ

1 голос
/ 12 февраля 2020

Все еще требует некоторой печати - но менее многословная версия

#standardSQL
WITH left_side AS (
  SELECT 1 AS id, 'hello' AS col1 UNION ALL 
  SELECT 2 AS id, 'there' AS col1
), right_side AS (
  SELECT 1 AS id, 'hello' AS col1 UNION ALL 
  SELECT 2 AS id, 'world' AS col1
)
SELECT *
FROM (SELECT NULL a_id, NULL a_col1 UNION ALL SELECT * FROM left_side) a
JOIN (SELECT NULL b_id, NULL b_col1 UNION ALL SELECT * FROM right_side) b
ON a_id = b_id

с результатом

Row a_id    a_col1  b_id    b_col1   
1   1       hello   1       hello    
2   2       there   2       world    

, поэтому будет так же, как показано ниже в bq ...

+------+--------+------+--------+
| a_id | a_col1 | b_id | b_col1 |
+------+--------+------+--------+
| 1    | hello  | 1    | hello  |
| 2    | there  | 2    | world  |
+------+--------+------+--------+
...