BigQuery 无法创建视图,但查询正常

Posted

技术标签:

【中文标题】BigQuery 无法创建视图,但查询正常【英文标题】:BigQuery can't create a view but query is ok 【发布时间】:2015-09-07 09:50:58 【问题描述】:

我使用 BigQuery 进行分析。 我写了这个查询。

[setup_chr_lvs] 的架构是

userId 是 STRING,

lv 是STRIMG,

chrLvs 是字符串

“[1, 25, 344]”(例如)

SELECT userId,
   lv,
   INTEGER(SPLIT( REGEXP_REPLACE( REGEXP_REPLACE(chrLvs, r'\[', ''), r'\]', ''), ",")) AS chrLv
   FROM [kpi.setup_chr_lvs]

此架构成功。 但无法保存视图。

创建视图失败。 无法为字段 chrLV 创建有效的输出架构。 尝试在最外层的 SELECT 中重命名 chrLv to f0_group.chrLv

为什么?

【问题讨论】:

【参考方案1】:

首先,错误消息中看起来很疯狂的建议实际上可以工作——而不是你的AS chrLv,而是AS f0_group.chrLv。我什至不会尝试解释确切的原因,因为我真的不能,但我可以提供一些背景信息,说明这件事何时发生以及如何解决它。

这里的关键是SPLITSPLIT 创建repeated values,其中单行单列包含多个值。 当您SPLIT "a,b,c" as val 时,直接结果是 single 行,其架构会显示为 val: string (repeated)

当您使用 SPLIT 运行查询时,默认情况下,查询结果是展平的:包含 3 次重复值的单行将变成 3 行。当您尝试保存视图时,行为有所不同:它不会变平。这就是您可以查询但不能保存视图的原因。 (如果需要,您可以通过设置查询选项来重现未展平的行为:取消选中“展平结果”(也称为“允许大”和“选择表格”)。)

那么,为什么未展平结果会出现有趣的错误呢?当您将函数应用于重复值时会发生这种情况。 SPLIT 创建重复输出,INTEGER 应用于此,在表达式的架构中触发意外。

解决方法是在应用该函数之前删除重复性(将其展平为多行)。首先是SPLIT,然后是FLATTEN,然后是INTEGER。像这样:

SELECT
  userId,
  lv,
  INTEGER(chrLvStr) as chrLv
FROM FLATTEN(
  (
  SELECT 
    userId,
    lv,
    SPLIT( REGEXP_REPLACE( REGEXP_REPLACE(chrLvs, r'\[', ''), r'\]', ''), ",") AS chrLvStr
  FROM [test.setup_chr_lvs]
  ), 
  chrLvStr
)

这会运行(并且可以保存为视图),其中[test.setup_chr_lvs] 是从此查询中保存的数据的单行模型:

select "user1" as userId, "lv1" as lv, "[1, 24, 344]" as chrLvs

(不,我没有用于FLATTEN 的缩进约定。)

【讨论】:

【参考方案2】:

不了解 BigQuery 的内部结构,我想这是因为在某种程度上,您的 chrLv 被分解为称为“chrLv”的部分属性,这会使系统感到困惑。

您是否尝试将“as”重命名为建议的名称?

【讨论】:

以上是关于BigQuery 无法创建视图,但查询正常的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery:无法创建视图。意外。请再试一次

无法创建视图 - BigQuery

如何使用 Java API 使用标准 SQL 创建 BigQuery 视图?

如何在文件中从SQL源创建BigQuery视图(Windows命令行)

如何使用 UI 从 BigQuery 中的视图创建表?

气流:无法使用 Bigquery 挂钩创建视图