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

时间:2015-09-07 09:50:59

标签: google-bigquery

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

  

[setup_chr_lvs]的架构是

     

userId是STRING,

     

lv是STRIMG,

     

chrLvs是STRING

     

" [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

为什么?

2 个答案:

答案 0 :(得分:2)

首先,错误消息的疯狂建议实际上可以起作用 - 而不是AS chrLvAS f0_group.chrLv。我甚至不想解释为什么会这么做,因为我真的无法解释,但我可以就这件事发生的时间以及如何解决这个问题给出一些背景知识。

这里的关键是SPLITSPLIT创建repeated values,这是单行和单列包含多个值的位置。 当您SPLIT "a,b,c" as val时,直接结果是行,其架构会显示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的缩进惯例。)

答案 1 :(得分:0)

不知道BigQuery的内部,我想这是因为在某种程度上,你的chrLv被分解为部分属性,称为" chrLv"这会混淆系统。

您是否尝试重命名" as"到了什么建议?