Как проверить типы столбцов всех разделов / сегментов в таблице BigQuery - PullRequest
0 голосов
/ 30 августа 2018

Меня попросили помочь проекту с некоторыми проблемами.

Первое, что они создали сегментированную / секционированную таблицу, это один фрагмент / секция данных в неделю. Дело в том, что появляется , что иногда столбец Date является STRING, а иногда TIMESTAMP (хотелось бы, чтобы они не использовали имена типов данных для имен столбцов)

Я обнаружил это с помощью следующего запроса ...

SELECT Date FROM `foor.bar.tableName_*` GROUP BY Date ORDER BY Date

Что дает ошибку ...

Cannot read field 'Date' of type STRING as TIMESTAMP_MICROS


Как мне легко определить, какие шарды / разделы имеют какие типы данных в этом столбце?

Как мне легко это исправить?

Есть ли у меня правильная терминология?

1 Ответ

0 голосов
/ 30 августа 2018

Проблема в том, что на самом деле это не секционированная таблица. Если вы используете многораздельную таблицу , у вас будет одна таблица с согласованной схемой для всех разделов, тогда как если вы используете несколько таблиц, которые имеют общий префикс и шаблон суффикса, такой гарантии нет. Я настоятельно рекомендую преобразовать существующие таблицы в разделенную таблицу, если вы можете.

Ради поиска несовместимых типов в таблицах INFORMATION_SCHEMA просмотров упростит анализ нескольких таблиц одновременно, но на данный момент есть один подход для поиска несовместимостей, если вы используя, например, терминал Bash:

DATASET=<dataset name here>
COLUMN_NAME=<column name here>
for table_name in `bq ls -n 1000 $DATASET | tail -n +3 | grep -Eo "t[^ ]+"`; do
  bq --format=json show $DATASET.$table_name | \
    sed -r "s/.*\{([^\{]*\"name\":\"$COLUMN_NAME\"[^\}]*)\}.*/\1/g" | \
    sed -r 's/.*\"type\":\"([^\"]+)\".*/\1/g' | \
    xargs echo $table_name | \
    sort;
done

Это дает вывод, как,

tableName20180101 STRING
tableName20180102 STRING
tableName20180103 TIMESTAMP
...
...