google-bigquery – BigQuery无法创建视图,但查询正常

我使用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的缩进惯例.)

点赞