2017-10-15 5 views
0

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.

+0

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. –

+0

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. –

Répondre

0

Si vous ajoutez la syntaxe de point dans la requête où vous sélectionnez * dans la dernière ligne, vous pouvez interroger les colonnes agrandie en température dans des colonnes spécifiques dans le tableau principal