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
。我什至不会尝试解释确切的原因,因为我真的不能,但我可以提供一些背景信息,说明这件事何时发生以及如何解决它。
这里的关键是SPLIT
。 SPLIT
创建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 无法创建视图,但查询正常的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java API 使用标准 SQL 创建 BigQuery 视图?