【问题标题】:BigQuery can't create a view but query is okBigQuery 无法创建视图,但查询正常
【发布时间】: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

为什么?

【问题讨论】:

    标签: google-bigquery


    【解决方案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”重命名为建议的名称?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-15
        相关资源
        最近更新 更多