J'ai une série de données dynamiques en cours de traitement par un travail Stream Analytics. Il y a quelques propriétés uniformes que je peux explicitement demander, mais la majeure partie de la charge utile est d'un type inconnu au moment de la requête. Mon objectif est de prendre ces données inconnues (l'enregistrement) et de promouvoir toutes les propriétés dans les champs de niveau supérieur de la requête résultante écrite dans une table Azure.La promotion des propriétés connues de l'enregistrement au niveau supérieur génère une requête Stream Analytics
Je suis capable d'aplatir les propriétés de l'enregistrement, il est toujours ajouté en tant qu'objet enfant à la requête. GetRecordProperties()
n'aide pas car je ne veux pas un enregistrement séparé retourné pour chaque propriété.
Ma requête ressemble à ceci:
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]
Et le dossier résultant je reçois ressemble à ceci. L'idée est de tout prendre dans l'objet imbriqué payload
pour ne pas être imbriqué afin que chaque propriété possède sa propre colonne dans la table 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"
}
}
Est-ce possible? L'UDF FlattenCustomDimensions
prend un tableau d'éléments et les expose en tant que propriétés. L'UDF ExtractJsonWebhookPayload
prend une chaîne & la convertit en JSON tandis que l'UDF FlattenWebhookPayload
prend l'objet complexe JSON & crée la syntaxe point que vous voyez dans l'objet payload
dans les résultats.
Mon but ultime est d'obtenir un ensemble de résultats qui ressemble à:
{
"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"
}
A moins que quelqu'un a une meilleure idée/option.
si vous connaissez tous les noms de colonne, il peut être possible d'écrire une requête pour promouvoir tous les champs imbriqués. Mais la requête va être grande et difficile à changer. Avez-vous envisagé d'utiliser [javascript UDF] (https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-javascript-user-defined-functions)? Ce sera beaucoup plus propre, vous devrez transmettre la charge utile complète dans un seul champ, que vous passerez à UDF. –
Eh bien oui, soit le point est que je ne connais pas les champs. Connaître les noms de champs est facile à traiter avec des requêtes directes utilisant la syntaxe à points. –