Повышение уровня известных свойств из записи до верхнего уровня приводит к запросу Stream Analytics.

У меня есть ряд динамических данных, обрабатываемых заданием Stream Analytics. Есть несколько универсальных свойств, которые я могу запросить явно, но основная часть полезной нагрузки имеет неизвестный тип во время запроса. Моя цель — взять эти неизвестные данные (запись) и перевести все свойства в поля верхнего уровня в результирующем запросе, который записывается в таблицу Azure.

Я могу сгладить свойства записи, она всегда добавляется в запрос как дочерний объект. GetRecordProperties() не помогает, так как я не хочу, чтобы для каждого свойства возвращалась отдельная запись.

Мой запрос выглядит так:

WITH 
[custom_events_temp] AS
(
    SELECT 
        [magellan].[context].[data].[eventTime] as [event_time],
        [flat_event].ArrayValue.name as [event_name],
        udf.FlattenCustomDimensions([magellan].[context].[custom].[dimensions]) as [flat_custom_dim]
    FROM [Magellan--AI-CustomEvents] magellan
    TIMESTAMP BY [magellan].[context].[data].[eventTime]
    CROSS APPLY GetElements([magellan].[event]) as [flat_event]
),
-- create table with extracted webhook data
[all_webhooks] AS
(
    SELECT
        [flat_custom_dim].[hook_event_source] as PartitionKey,
        udf.CreateGuid('') as RowKey,
        -- event data
        [custom_events_temp].[event_time],
        [custom_events_temp].[flat_custom_dim].[hook_event_name] as [event_name],
        -- webhook payload data        
        udf.FlattenWebhookPayload(udf.ExtractJsonWebhookPayload([custom_events_temp].[flat_custom_dim].[webhook_payload])) AS [payload]
    FROM [custom_events_temp]
)
SELECT * INTO [TrashTableOut] FROM [all_webhooks]

И результирующая запись, которую я получаю, выглядит так. Идея состоит в том, чтобы все элементы вложенного объекта payload не были вложенными, чтобы каждое свойство имело свой собственный столбец в таблице Azure.

{
  "partitionkey": "zzzzzzzzz",
  "rowkey": "8beeb783-b07f-8a98-ef56-71c43378a5fc",
  "event_time": "2017-10-15T05:37:06.3240000Z",
  "event_name": "subscriber.updated_lead_score",
  "payload": {
    "event": "subscriber.updated_custom_field",
    "data.subscriber.id": "...",
    "occurred_at": "2017-10-15T05:36:57.000Z",
    "data.account_id": "11111",
    "data.subscriber.status": "active",
    "data.subscriber.custom_fields.coupon": "xxxxxxx",
    "data.subscriber.custom_fields.coupon_discounted_price": "11111",
    "data.subscriber.custom_fields.coupon_pre_discount_price": "11111",
    "data.subscriber.custom_fields.name": "John Doe",
    "data.subscriber.custom_fields.first_name": "John",
    "data.subscriber.custom_fields.ip_address": "0.0.0.0",
    "data.subscriber.tags": "tag1,tag2,tag3",
    "data.subscriber.time_zone": "Europe/Berlin",
    "data.subscriber.utc_offset": 120,
    "data.subscriber.created_at": "2017-03-27T18:19:35.000Z"
  }
}

Это возможно? UDF FlattenCustomDimensions берет массив элементов и предоставляет их как свойства. UDF ExtractJsonWebhookPayload берет строку и преобразует ее в JSON, а UDF FlattenWebhookPayload берет сложный объект JSON и создает точечный синтаксис, который вы видите в объекте payload в результатах.

Моя конечная цель - получить набор результатов, который выглядит так:

{
  "partitionkey": "zzzzzzzzz",
  "rowkey": "8beeb783-b07f-8a98-ef56-71c43378a5fc",
  "event_time": "2017-10-15T05:37:06.3240000Z",
  "event_name": "subscriber.updated_lead_score",
  "payload.event": "subscriber.updated_custom_field",
  "payload.data.subscriber.id": "...",
  "payload.occurred_at": "2017-10-15T05:36:57.000Z",
  "payload.data.account_id": "11111",
  "payload.data.subscriber.status": "active",
  "payload.data.subscriber.custom_fields.coupon": "xxxxxxx",
  "payload.data.subscriber.custom_fields.coupon_discounted_price": "11111",
  "payload.data.subscriber.custom_fields.coupon_pre_discount_price": "11111",
  "payload.data.subscriber.custom_fields.name": "John Doe",
  "payload.data.subscriber.custom_fields.first_name": "John",
  "payload.data.subscriber.custom_fields.ip_address": "0.0.0.0",
  "payload.data.subscriber.tags": "tag1,tag2,tag3",
  "payload.data.subscriber.time_zone": "Europe/Berlin",
  "payload.data.subscriber.utc_offset": 120,
  "payload.data.subscriber.created_at": "2017-03-27T18:19:35.000Z"
}

Если только у кого-то нет идеи/варианта получше.


person Andrew Connell    schedule 15.10.2017    source источник


Ответы (1)


Если вы добавите точечный синтаксис в запрос, где вы выбираете * в последней строке, вы можете запросить столбцы, которые вы расширили в temp, в определенные столбцы в основной таблице.

person Wes Hackett    schedule 16.10.2017