【问题标题】:Select several event params in a single row for Firebase events stored in Google BigQuery在一行中为存储在 Google BigQuery 中的 Firebase 事件选择多个事件参数
【发布时间】:2017-02-21 05:53:11
【问题描述】:

我正在尝试对存储在 Google BigQuery 中的 Firebase 事件执行非常简单的查询,但我无法找到方法。

在 Android 应用中,我正在记录这样的事件:

Bundle params = new Bundle();
params.putInt("productID", productId);
params.putInt(FirebaseAnalytics.Param.VALUE, value);
firebaseAnalytics.logEvent("productEvent", params);

所以,在 BigQuery 中我有这样的东西:

 ___________________ _______________________ _______________
| event_dim.name | event_dim.params.key | event_dim.params.int_value |
|___________________|_______________________|_________________________|
|产品活动 |产品ID | 25 |
| |_______________________|_____________________________|
| |价值 |第1253章
|___________________|_______________________|_________________________| 

当我从这个表中获取数据时,我得到两行:

 ___________________ _______________________ _______________
|event_dim.name | event_dim.params.key | event_dim.params.int_value |
|___________________|_______________________|_________________________|
|产品活动 |产品ID | 25 |
|产品活动 |价值 | 12353 |

但我真正需要的是这个表中的一个 SELECT 子句来获取如下数据:

 ___________________ _____________ _________
|姓名 |产品ID |价值 |
|___________________|_____________|_________|
|产品活动 | 25 | 12353 |

有什么想法或建议吗?

【问题讨论】:

  • 您的费率很低。对 SO 很重要,您必须使用已发布答案左侧、投票下方的勾号来标记已接受的答案。这将提高您的费率。通过访问此链接了解其工作原理:meta.stackoverflow.com/questions/5234/…
  • 你说得对,谢谢

标签: firebase google-bigquery firebase-analytics


【解决方案1】:

您可以像这样将值转置到列中

SELECT 
  event_dim.name as name,
  MAX(IF(event_dim.params.key = "productID", event_dim.params.int_value, NULL)) WITHIN RECORD productID,
  MAX(IF(event_dim.params.key = "value", event_dim.params.int_value, NULL)) WITHIN RECORD value,
FROM [events] 

如果您想使用 SQL 生成此命令,请参阅此解决方案:Pivot Repeated fields in BigQuery

【讨论】:

  • 这很好用。谢谢!但是使用 MAX 对 string_value 不起作用,对吧?
  • 使用 MAX will 也适用于字符串值。还要检查stackoverflow.com/a/33769831/5221944 - 作为答案建议
【解决方案2】:

使用standard SQL(取消选中UI中“显示选项”下的“使用旧版SQL”),您可以将查询表示为:

SELECT 
  event_dim.name as name,
  (SELECT value.int_value FROM UNNEST(event_dim.params)
   WHERE key = "productID") AS productID,
  (SELECT value.int_value FROM UNNEST(event_dim.params)
   WHERE key = "value") AS value
FROM `dataset.mytable` AS t,
  t.event_dim AS event_dim;

编辑:根据下面的评论,更新示例以将 int_value 包含为 value 的一部分。这是一个独立的示例,也演示了该方法:

WITH T AS (
  SELECT ARRAY_AGG(event_dim) AS event_dim
  FROM (
    SELECT STRUCT(
        "foo" AS name,
        ARRAY<STRUCT<key STRING, value STRUCT<int_value INT64, string_value STRING>>>[
          ("productID", (10, NULL)), ("value", (5, NULL))
        ] AS params) AS event_dim
    UNION ALL
    SELECT STRUCT(
        "bar" AS name,
        ARRAY<STRUCT<key STRING, value STRUCT<int_value INT64, string_value STRING>>>[
          ("productID", (13, NULL)), ("value", (42, NULL))
        ] AS params) AS event_dim
  )
)
SELECT 
  event_dim.name as name,
  (SELECT value.int_value FROM UNNEST(event_dim.params)
   WHERE key = "productID") AS productID,
  (SELECT value.int_value FROM UNNEST(event_dim.params)
   WHERE key = "value") AS value
FROM T AS t,
  t.event_dim AS event_dim;

【讨论】:

  • 这看起来很棒@Elliott Brossard。不幸的是,运行此查询时出现错误:错误:未找到:表 :event_dim.params
  • 具有您在问题中提供的架构 - Elliott 的查询 must 工作和 is 工作。因此,要么您的架构略有不同,要么您有其他东西——比如查询中的拼写错误。等等。只是建议多玩这个
  • 您介意共享您尝试运行的查询(或执行失败的作业 ID)吗?米哈伊尔是对的,鉴于您最初的问题,假设您替换 my-dataset.mytable 表名,我发布的内容将起作用。
  • 我的专栏的真实名称是event_dim.params.value.int_value而不是event_dim.params.int_value。我不知道这是否是使您的查询在我的数据库中失败的原因。我尝试了: SELECT event_dim.name 作为名称,(SELECT int_value FROM UNNEST(event_dim.params.value) WHERE key = "productID") AS productID, (SELECT int_value FROM UNNEST(event_dim.params.value) WHERE key = "value ") AS value FROM myTable.app_events_20161010 错误是:Error: Invalid table name: event_dim:params.value
  • 我仍然不确定你是如何得到这个错误的。可以分享一个工作ID吗?您可以在 UI 的“查询历史记录”下找到过去查询的作业 ID。不过,我根据您的反馈更新了我的示例(将int_value 包含在value 中)。
猜你喜欢
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
相关资源
最近更新 更多