Это правда, что произошла смена схемы в Google Analytics для Firebase BigQuery Export .Хотя не существует четкого сопоставления старых полей по сравнению с новыми, SQL-запрос, предоставленный в документации для переноса существующих наборов данных BQ из старой схемы в новую , дает некоторые подсказкикак эти поля изменились.
Я разделяю SQL-запрос migration_script.sql
ниже, просто для справки, но позвольте мне указать наиболее важные изменения для вашего варианта использования:
- event_dim отображается как событие в запросе SQL, но не имеет окончательного представления в схеме, поскольку event_dim больше не является вложенным полем:
UNNEST(event_dim) AS event
- event_dim.timestamp_micros отображается как event_timestamp :
event.timestamp_micros AS event_timestamp
- event_dim.name отображается как event_name :
event.name AS event_name
- event_param.value.int_value отображается как event_params.value.int_value :
event_param.value.int_value AS int_value
- user_dim.user_properties отображается как user_properties , и все его вложенные значения имеют одинаковую структуру:
UNNEST(user_dim.user_properties) AS user_property) AS user_properties
Итак, в целом, изменение схемы было сфокусировано на простоте развертывания нескольких полей таким образом, что, например, вместо необходимости доступа к event_dim.name
(что потребовало бы отмены и усложнения запроса), вы можете запросить непосредственно поле event_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
Эти запросы эквивалентны, но ссылаясь на таблицы wiСтарая и новая схемы.Обратите внимание, что, поскольку ваш запрос более сложный, вам может понадобиться добавить UNNEST (), чтобы получить доступ к оставшимся вложенным полям в таблице.
Кроме того, вы можете захотеть взглянуть на эти примеры , которые могут помочь вам с некоторыми идеями о том, как писать запросы с новой схемой.
РЕДАКТИРОВАТЬ 2
Насколько я понимаю, запрос, подобный приведенному ниже, должен позволять запрашивать все поля в одном выражении.Я группирую по всем неагрегированным / отфильтрованным полям, но в зависимости от вашего варианта использования (это, безусловно, вам нужно работать самостоятельно), вы можете применить другую стратегию, чтобы иметь возможность запрашивать несгруппированные поля (т. е. используйте фильтр MIN / MAX и т. д.).
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
ПРИЛОЖЕНИЕ
migration_script.sql
:
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