我正在使用BigQuery的标准SQL Wildcard Table功能。
我有一个包含以下架构的表:
>>> s = mit.seekable(range(3))
>>> s.next()
# 0
>>> s.seek(0) # reset iterator
>>> s.next()
# 0
>>> s.next()
# 1
>>> s.seek(1)
>>> s.next()
# 1
>>> next(s)
# 2
由于我的数据集中的表格具有混合模式且其名称通常不作为前缀,我打算进行广泛的通配符匹配 - 然后缩小_PARTITIONTIME TIMESTAMP NULLABLE
stamp TIMESTAMP NULLABLE
value FLOAT NULLABLE
source STRING NULLABLE
...
中的_TABLE_SUFFIX
:
WHERE
这是我能做到的基础。 SELECT
*,
_TABLE_SUFFIX AS table_name
FROM `my-project.my-dataset.*`
WHERE REGEXP_CONTAINS(_TABLE_SUFFIX, r"cars")
只匹配一个表。
我打算在上面的REGEX中添加其他表。例如:cars
当我执行上述查询时,出现以下错误:
cars|trucks|...
此外,当我尝试从我的Cannot read field 'stamp' of type TIMESTAMP_MICROS as DATETIME
中移除stamp
并使用其中的SELECT
列时:
source
BigQuery现在告诉我:SELECT
source,
_TABLE_SUFFIX AS table_name
FROM `my-project.my-dataset.*`
WHERE REGEXP_CONTAINS(_TABLE_SUFFIX, r"cars")
这两种情况都发生了什么?为什么BigQuery想要投射我的Unrecognized name: source at [2:1]
列,为什么它无法找到stamp
?
答案 0 :(得分:4)
这两种情况都发生了什么?为什么BigQuery想要投射我的邮票列,为什么它无法找到源?
为了执行使用通配符表的标准SQL查询,BigQuery会自动推断该表的架构。 BigQuery使用最近创建的表的模式,该表与通配符匹配,作为通配符表的模式。如果模式在通配符表匹配的表之间不一致,则BigQuery会返回错误。
这解释了你看到的两种情况!
在第一种情况下 - 最新的表将_PARTITIONTIME作为DATETIME数据类型
在第二种情况下 - 同一个最近的表只是在其中没有source
字段