我被要求帮助解决一些问题的项目。
第一个是他们创建了一个分片/分区表,每周一个分片/分区数据。问题是,有时候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
如何轻松识别哪个分片/分区具有该列中的哪些数据类型?
我该如何轻松纠正这个问题?
我有正确的术语吗?
问题是这实际上不是分区表。如果使用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
...