如何检查BigQuery表中所有分区/分片的列类型

问题描述 投票:0回答:1

我被要求帮助解决一些问题的项目。

第一个是他们创建了一个分片/分区表,每周一个分片/分区数据。问题是,有时候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

如何轻松识别哪个分片/分区具有该列中的哪些数据类型?

我该如何轻松纠正这个问题?

我有正确的术语吗?

google-bigquery sqldatatypes partition
1个回答
1
投票

问题是这实际上不是分区表。如果使用partitioned table,则所有分区都有一个具有一致模式的表,而如果使用多个共享公共前缀和后缀模式的表,则没有这样的保证。如果可以的话,我强烈建议将现有表转换为分区表。

为了在表中找到不兼容的类型,INFORMATION_SCHEMA views将使一次分析多个表更容易,但是现在,这是一种查找不兼容性的方法,假设您正在使用例如一个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
...
© www.soinside.com 2019 - 2024. All rights reserved.