Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何用Firebase analytics替换旧模式中的事件来在新模式中编写Bigquery?_Sql_Google Cloud Platform_Google Bigquery_Firebase Analytics - Fatal编程技术网

Sql 如何用Firebase analytics替换旧模式中的事件来在新模式中编写Bigquery?

Sql 如何用Firebase analytics替换旧模式中的事件来在新模式中编写Bigquery?,sql,google-cloud-platform,google-bigquery,firebase-analytics,Sql,Google Cloud Platform,Google Bigquery,Firebase Analytics,旧的BigQuery导出架构脚本正在运行。如下所示。但我想复制这段代码,并根据新的导出模式编写它,因为Bigquery模式已经更改。请帮助,因为在新的BigQuery导出模式中,我找不到任何其他对应的记录 根据旧的BigQuery导出架构,event_dim event_dim处于中 以下是BigQuery导出架构的链接: 尝试了下面的查询,但我想要的是一个SELECT语句中的应用程序实例、最小时间、最大时间、事件名称、参与时间。由于我使用的是“分组方式”,我无法一次获取所有这些应用程序的实例、

旧的BigQuery导出架构脚本正在运行。如下所示。但我想复制这段代码,并根据新的导出模式编写它,因为Bigquery模式已经更改。请帮助,因为在新的BigQuery导出模式中,我找不到任何其他对应的记录 根据旧的BigQuery导出架构,event_dim event_dim处于中

以下是BigQuery导出架构的链接:

尝试了下面的查询,但我想要的是一个SELECT语句中的应用程序实例、最小时间、最大时间、事件名称、参与时间。由于我使用的是“分组方式”,我无法一次获取所有这些应用程序的实例、最短时间、最长时间、事件名称、参与时间。请帮忙

 SELECT user_pseudo_id
     , MIN(event_timestamp) AS min_time
      ,MAX(event_timestamp) AS max_time
    FROM `xxx.app_events_*` as T,
       T.event_params,
       T.user_properties,
       T.event_timestamp
    where (event_name = "user_engagement" and event_params.key = "engagement_time_msec")
    and
            (user_properties.key = "access" and user_properties.value.string_value = "true") and
            PARSE_DATE('%Y%m%d', event_date) >= date_sub("{{upto_date (yyyy-mm-dd)}}", interval {{last n days}} day) and
            PARSE_DATE('%Y%m%d', event_date) <= "{{upto_date (yyyy-mm-dd)}}"
    group by 1

确实,中存在架构更改。尽管与新字段相比,旧字段没有明确的映射,但文档中提供的SQL查询提供了一些提示,说明这些字段是如何更改的

我在下面分享migration_script.sql查询,仅供参考,但让我指出与您的用例最相关的更改:

event_dim在SQL查询中映射为event,但在架构中没有任何最终表示形式,因为event_dim不再是嵌套字段:UnestEvent_dim as event event_dim.timestamp_micros映射为event_timestamp:event.timestamp_micros映射为event_timestamp event_dim.name映射为event_name:event.name映射为event_name event_param.value.int_值映射为event_params.value.int_值:event_param.value.int_值映射为int_值 user_dim.user_属性映射为user_属性,其所有嵌套值遵循相同的结构:UNNESTuser_dim.user_属性作为user_属性作为user_属性作为user_属性 因此,总而言之,为了简单起见,模式更改的重点是取消几个字段的测试,例如,您可以直接查询字段event_name,而不必访问event_dim.name,这将需要取消测试并使查询复杂化

考虑到这一点,我相信您将能够根据这个新模式调整查询,并且它可能看起来更简单,因为您不必不需要列出这么多字段

为了澄清,让我与您分享两个示例BQ查询,比较它们使用的公共Firebase表的旧模式和新模式,因此您应该能够开箱即用地运行它们:

# Old Schema - UNNEST() required because there are nested fields
SELECT
  user_dim.app_info.app_instance_id,
  MIN(event.timestamp_micros) AS min_time,
  MAX(event.timestamp_micros) AS max_time,
  event.name
FROM
  `firebase-public-project.com_firebase_demo_ANDROID.app_events_20180503`,
  UNNEST(event_dim) AS event
WHERE
  event.name = "user_engagement"
GROUP BY
  user_dim.app_info.app_instance_id,
  event.name
与之相比:

# New Schema - UNNEST() not required because there are no nested fields
SELECT
  user_pseudo_id,
  MIN(event_timestamp) AS min_time,
  MAX(event_timestamp) AS max_time,
  event_name
FROM
  `firebase-public-project.analytics_153293282.events_20180815`
WHERE
  event_name = "user_engagement"
GROUP BY
  user_pseudo_id,
  event_name
这些查询是等效的,但引用了具有新旧模式的表。请注意,由于查询更复杂,您可能需要添加一些UNNEST以访问表中剩余的嵌套字段

此外,您可能想了解一下如何使用新模式编写查询的一些想法

编辑2

我的理解是,像下面这样的查询应该允许您在一条语句中查询所有字段。我按所有未聚合/过滤字段进行分组,但根据您的使用情况,这肯定是您需要自己解决的问题。您可能希望应用不同的策略,以便能够查询未分组字段,即使用最小/最大过滤器等

SELECT
  user_pseudo_id,
  MIN(event_timestamp) AS min_time,
  MAX(event_timestamp) AS max_time,
  event_name,
  par.value.int_value AS engagement_time
FROM
  `firebase-public-project.analytics_153293282.events_20180815`,
  UNNEST(event_params) as par
WHERE
  event_name = "user_engagement" AND par.key = "engagement_time_msec"
GROUP BY
  user_pseudo_id,
  event_name,
  par.value.int_value
附件

迁移\u script.sql:

因为我相信我之前的回答为社区提供了一些一般性的想法,我将保留它并编写一个新的,以便更具体地针对您的用例

首先,我想澄清一下,为了像您要求我们做的那样调整查询,需要清楚地理解语句、查询目标、预期结果和要处理的数据。由于情况并非如此,因此很难使用它,更重要的是,考虑到查询中存在一些不清楚的功能,例如:为了获得每个事件的最小和最大时间,您在多个事件中取最小和最大值,这对我来说没有明确意义,根据您的用例,我建议您提供更多细节或自己处理查询会更好的原因。此外,新模式将事件展平,这样每个事件都写在不同的行中。您可以通过运行“table_with_old_schema”中的SELECT COUNT*,并将其与“table_with_new_schema”中的SELECT COUNT*进行比较,轻松检查这一点;您将看到第二个字段有更多的行,因此您的查询不再有意义,因为事件不再分组,因此您无法在嵌套字段之间选择最小值和最大值

这一点需要澄清,并且删除了一些无法直接适应新模式的字段,您可以从自己的角度进行调整,但这需要一些额外的努力,并理解这些字段在您之前的查询中对您意味着什么,这里有两个查询 在同一个表上运行时,使用不同的模式提供完全相同的结果:

对具有旧架构的表进行查询:

使用新架构对同一表进行查询:


同样,我使用公共数据集中的下表:firebase-public-project.com\u firebase\u demo\u ANDROID.app\u events\u yyyyymmdd,因此我必须更改一些过滤器并删除一些其他过滤器,以便它根据该表检索合理的结果。因此,您可以随意修改或添加所需的内容,以使其对您的用例有用。

先生,您提到的事件映射为事件。但是我检查了两个模式,在对应于event_dim的新模式中没有名为event的记录!如果我的回答令人困惑,我很抱歉。我的意思是,在用于转换的SQL查询中,event_dim被命名为event,但实际上event_dim不再是模式中的记录列,因此所有嵌套字段都已成为普通字段。我已经更新了答案,为您提供了一个简单的例子来理解比较,但我希望您理解,对于您的具体查询,您必须在我在答案中提供的信息的帮助下,从您的角度重新编写它。先生,我试过了,但在我的查询中,我只需要替换event_dim。您能告诉我如何在新模式的数组中表示UNNESTevent_dim->中选择MAXtimestamp_micros吗。因为我不希望事件\ U时间戳作为单个值,我希望它像上面一样。嗨@subhandura你能详细说明一下你所说的可以在数组中表示的意思吗?我运行了一个与您在问题中共享的查询类似的查询,但是使用了一个公共数据集和,因此我不确定我与您共享的查询旧模式和新模式之间的区别。在任何情况下,如果您想了解更多关于在标准SQL中构造数组和使用它们的信息,您可以查看相应的。我更新了我的问题,在下面添加了一些部分,尝试根据新模式编写查询。现在的问题是**我无法在一个SELECT语句中获取所有这些应用程序实例、最小时间、最大时间、事件名称、参与时间。先生,谢谢你的澄清。现在情况更容易理解了。我正在处理查询,并按照您的要求发布了整个查询。我在这个问题中问过-。我需要一个会话分发表。所以我的查询是下面两个查询的合并。所以我的查询是下面两个查询的合并。如果你仔细研究过这个查询,你可能会明白,我需要计算会话分布,我需要以某种方式使用event\u timestamp来计算MaxTime和MinTIme app\u instance\u id。先生,您能帮我建议一下计算最大时间和最小时间的方法吗?正如您所提到的,您的查询不再有意义,因为事件不再分组,您无法在嵌套字段之间选择最小值和最大值??!
SELECT
  user_pseudo_id,
  MIN(event_timestamp) AS min_time,
  MAX(event_timestamp) AS max_time,
  event_name,
  par.value.int_value AS engagement_time
FROM
  `firebase-public-project.analytics_153293282.events_20180815`,
  UNNEST(event_params) as par
WHERE
  event_name = "user_engagement" AND par.key = "engagement_time_msec"
GROUP BY
  user_pseudo_id,
  event_name,
  par.value.int_value
  SELECT
  @date AS event_date,
  event.timestamp_micros AS event_timestamp,
  event.previous_timestamp_micros AS event_previous_timestamp,
  event.name AS event_name,
  event.value_in_usd  AS event_value_in_usd,
   user_dim.bundle_info.bundle_sequence_id AS event_bundle_sequence_id,
  user_dim.bundle_info.server_timestamp_offset_micros as event_server_timestamp_offset,
  (
  SELECT
    ARRAY_AGG(STRUCT(event_param.key AS key,
        STRUCT(event_param.value.string_value AS string_value,
          event_param.value.int_value AS int_value,
          event_param.value.double_value AS double_value, 
          event_param.value.float_value AS float_value) AS value))
  FROM
    UNNEST(event.params) AS event_param) AS event_params,
  user_dim.first_open_timestamp_micros AS user_first_touch_timestamp,
  user_dim.user_id AS user_id,
  user_dim.app_info.app_instance_id AS user_pseudo_id,
  "" AS stream_id,
  user_dim.app_info.app_platform AS platform,
  STRUCT( user_dim.ltv_info.revenue AS revenue,
    user_dim.ltv_info.currency AS currency ) AS user_ltv,
  STRUCT( user_dim.traffic_source.user_acquired_campaign AS name,
      user_dim.traffic_source.user_acquired_medium AS medium,
      user_dim.traffic_source.user_acquired_source AS source ) AS traffic_source,
  STRUCT( user_dim.geo_info.continent AS continent,
    user_dim.geo_info.country AS country,
    user_dim.geo_info.region AS region,
    user_dim.geo_info.city AS city ) AS geo,
  STRUCT( user_dim.device_info.device_category AS category,
    user_dim.device_info.mobile_brand_name,
    user_dim.device_info.mobile_model_name,
    user_dim.device_info.mobile_marketing_name,
    user_dim.device_info.device_model AS mobile_os_hardware_model,
    @platform AS operating_system,
    user_dim.device_info.platform_version AS operating_system_version,
    user_dim.device_info.device_id AS vendor_id,
    user_dim.device_info.resettable_device_id AS advertising_id,
    user_dim.device_info.user_default_language AS language,
    user_dim.device_info.device_time_zone_offset_seconds AS time_zone_offset_seconds,
    IF(user_dim.device_info.limited_ad_tracking, "Yes", "No") AS is_limited_ad_tracking ) AS device,
  STRUCT( user_dim.app_info.app_id AS id,
    @firebase_app_id  AS firebase_app_id,
    user_dim.app_info.app_version AS version,
    user_dim.app_info.app_store AS install_source ) AS app_info,
  (
  SELECT
    ARRAY_AGG(STRUCT(user_property.key AS key,
        STRUCT(user_property.value.value.string_value AS string_value,
          user_property.value.value.int_value AS int_value,
          user_property.value.value.double_value AS double_value,
          user_property.value.value.float_value AS float_value,
          user_property.value.set_timestamp_usec AS set_timestamp_micros ) AS value))
  FROM
    UNNEST(user_dim.user_properties) AS user_property) AS user_properties
FROM
  `SCRIPT_GENERATED_TABLE_NAME`,
  UNNEST(event_dim) AS event
SELECT
  user_dim.app_info.app_instance_id,
  event.name,
  params.value.int_value engagement_time
FROM
  `DATASET.app_events_YYYYMMDD`,
  UNNEST(event_dim) AS event,
  UNNEST(event.params) AS params,
  UNNEST(user_dim.user_properties) AS user_params
WHERE
  (event.name = "user_engagement"
    AND params.key = "engagement_time_msec")
  AND (user_params.key = "plays_quickplay"
    AND user_params.value.value.string_value = "true")
ORDER BY 1, 2, 3
SELECT
  user_pseudo_id,
  event_name,
  params.value.int_value engagement_time
FROM
  `DATASET.events_YYYYMMDD`,
  UNNEST(event_params) AS params,
  UNNEST(user_properties) AS user_params
WHERE
  (event_name = "user_engagement"
    AND params.key = "engagement_time_msec")
  AND (user_params.key = "plays_quickplay"
    AND user_params.value.string_value = "true")
ORDER BY 1, 2, 3