我使用BigQuery进行分析.
我写了这个查询.
[setup_chr_lvs]’s schema is
userId is STRING,
lv is STRIMG,
chrLvs is STRING
“[1, 25, 344]” (for example)
SELECT userId,
lv,
INTEGER(SPLIT( REGEXP_REPLACE( REGEXP_REPLACE(chrLvs, r'\[', ''), r'\]', ''), ",")) AS chrLv
FROM [kpi.setup_chr_lvs]
此架构是成功的.
但无法保存视图.
无法创建视图.
无法为字段chrLV创建有效的输出架构.
尝试在最外面的SELECT中将chrLv重命名为f0_group.chrLv.
为什么?
最佳答案 首先,错误消息的疯狂建议实际上可以工作 – 而不是你的AS chrLv,有AS f0_group.chrLv.我甚至都不会试图解释原因,因为我不能真的,但我可以给出一些关于何时发生这种事情以及如何解决它的背景.
这里的关键是SPLIT. SPLIT创建repeated values,这是单行和单列包含多个值的位置.
当您将“a,b,c”作为val分割时,立即结果是一行,其架构将表示val:string(重复).
当您使用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的缩进惯例.)