代码之家  ›  专栏  ›  技术社区  ›  MatBailie

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

  •  0
  • MatBailie  · 技术社区  · 6 年前

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

    第一个是他们创建了一个shard/partitioned表,即每周一个shard/partition的数据。问题是,它 出现 有时候 Date 列是字符串,有时是时间戳 (我希望他们不要使用数据类型名称作为列名)

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

    这就产生了错误。。。

    Cannot read field 'Date' of type STRING as TIMESTAMP_MICROS
    


    如何轻松更正此问题?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Elliott Brossard    6 年前

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