记录前缀缺失

Posted

技术标签:

【中文标题】记录前缀缺失【英文标题】:Record Prefix Missing 【发布时间】:2017-01-25 21:34:27 【问题描述】:

我很困惑为什么以下两个查询的列标题输出不同。

select fullVisitorId , visitNumber, visitId, visitStartTime, date,totals.visits, totals.hits, totals.pageviews, totals.timeOnSite from 33959632.ga_sessions_20170124

返回的前 7 列具有以下名称。

访问者 ID |访问号码 |访问ID |访问开始时间 |日期 | totals.visits | totals.hits

SELECT fullVisitorId , visitNumber, visitId, visitStartTime, date,   
totals.visits, totals.hits  FROM `33959632.ga_sessions_20170101`

下面的结果现在删除了 Total 记录前缀。

fullVisitorId |访问号码 |访问ID |访问开始时间 |日期 | 访问次数 |命中

为什么从访问次数和点击次数中删除了总计?我们如何在结果中保留前缀名称(除了手动命名列)。

【问题讨论】:

【参考方案1】:

我认为在 GA 中 - 每个模式 - totals 字段不是数组,而只是记录 所以,试试下面

#standardSQL
SELECT
  fullVisitorId,
  visitNumber,
  visitId,
  visitStartTime,
  date,
  STRUCT(totals.visits, totals.hits, totals.pageviews, totals.timeOnSite) AS totals
FROM `33959632.ga_sessions_20170101`

为什么从访问次数和点击次数中删除了总计?

在 SELECT 列表中,如果存在没有显式别名的表达式,BigQuery 会根据以下规则分配隐式别名。

对于标识符,别名就是标识符。例如,SELECT abc 暗示 AS abc。 对于路径表达式,别名是路径中的最后一个标识符。例如,SELECT abc.def.ghi 暗示 AS ghi。 对于使用“点”成员字段访问运算符的字段访问,别名是字段名称。例如,SELECT (struct_function()).fname 意味着 AS fname。

你可以阅读更多关于Implicit aliases的信息

你可以阅读更多关于Aliases的信息

【讨论】:

【参考方案2】:

如果您在标准 SQL 中选择字段路径,则结果将具有路径中叶字段的类型。如果你想生成一个结构来镜像原始结构,你可以这样做:

#standardSQL
SELECT
  fullVisitorId,
  visitNumber,
  visitId,
  visitStartTime,
  date,
  STRUCT(
    totals.visits,
    totals.hits,
    totals.pageviews,
    totals.timeOnSite) AS totals
FROM 33959632.ga_sessions_20170124;

这会在结果的结构中返回totals 的指示字段。

【讨论】:

我上面的代码是在标准 sql 中,我确实取消了扁平化结果的选项。但是,它仍然会从所有内容中删除记录前缀。听起来有必要使用您建议的代码吗?感谢您的回复! 啊,我明白了。 Mikhail 最终给出了相同的答案,但基本思想是,如果要在结果中保留 totals 的形状,则应使用 STRUCT 运算符。如果您想在结果中包含其所有字段,另一种方法是直接选择totals :o) 在我回答的时候——我认为这是两个不同的答案。但绝对是相同的概念。同意

以上是关于记录前缀缺失的主要内容,如果未能解决你的问题,请参考以下文章

Logback SyslogAppender stacktrace 日志记录前缀

LeetCode刷题记录_最长公共前缀

前缀,中缀,后缀表达式求值

数据结构——前缀树

ARC096D Static Sushi 记录前缀最大值

AcWing 3493 - 最大的和 - 前缀和