2017-10-15 4 views
0

일련의 동적 데이터가 스트림 분석 작업에 의해 처리되고 있습니다. 명시 적으로 쿼리 할 수있는 몇 가지 균일 한 속성이 있지만 페이로드 대량은 쿼리시 알 수없는 형식입니다. 필자의 목표는 알 수없는 데이터 (레코드)를 가져 와서 모든 속성을 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] 

을 내가 얻는 결과 기록은 다음과 같습니다

내 쿼리는 다음과 같습니다. 아이디어는 각각의 속성이 Azure 테이블에 자신의 열을 가지도록 중첩되지 않는 중첩 된 객체 인 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", 
    "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" 
} 

사람이 더 나은 아이디어/옵션이없는 한.

+0

모든 열 이름을 알고 있다면, 그것은 할 수있다 중첩 된 모든 필드를 승격시키기위한 질의를 작성할 수 있어야합니다. 그러나 쿼리는 커지고 변경하기가 어려울 것입니다. [javascript UDF] (https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-javascript-user-defined-functions)를 사용 해본 적이 있습니까? 훨씬 더 깨끗해질 것입니다. 하나의 필드에서 전체 페이로드를 전달해야합니다.이 필드는 UDF로 전달됩니다. –

+0

그래, 요점은 내가 필드를 모른다는 것입니다. 필드 이름을 알고 있으면 도트 구문을 사용하는 직접 쿼리로 쉽게 해결할 수 있습니다. –

답변

0

당신이 마지막 줄에 사용자가 선택한 쿼리 *에 도트 구문을 추가 할 경우, 당신은 당신이 기본 테이블의 특정 컬럼에 임시 확대 열을 조회 할 수 있습니다