【问题标题】:How to check the column types of all partitions/shards in a BigQuery table如何检查 BigQuery 表中所有分区/分片的列类型
【发布时间】:2019-02-05 05:39:04
【问题描述】:

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

第一个是他们创建了一个分片/分区表,是每周一个分片/分区的数据。问题是,它似乎有时Date 列是一个字符串,有时它是一个时间戳(我希望他们不会为列使用数据类型名称名字)

我通过以下查询发现了这一点...

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】:

    问题在于这实际上不是一个分区表。如果您使用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
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多