일련의 동적 데이터가 스트림 분석 작업에 의해 처리되고 있습니다. 명시 적으로 쿼리 할 수있는 몇 가지 균일 한 속성이 있지만 페이로드 대량은 쿼리시 알 수없는 형식입니다. 필자의 목표는 알 수없는 데이터 (레코드)를 가져 와서 모든 속성을 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"
}
사람이 더 나은 아이디어/옵션이없는 한.
모든 열 이름을 알고 있다면, 그것은 할 수있다 중첩 된 모든 필드를 승격시키기위한 질의를 작성할 수 있어야합니다. 그러나 쿼리는 커지고 변경하기가 어려울 것입니다. [javascript UDF] (https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-javascript-user-defined-functions)를 사용 해본 적이 있습니까? 훨씬 더 깨끗해질 것입니다. 하나의 필드에서 전체 페이로드를 전달해야합니다.이 필드는 UDF로 전달됩니다. –
그래, 요점은 내가 필드를 모른다는 것입니다. 필드 이름을 알고 있으면 도트 구문을 사용하는 직접 쿼리로 쉽게 해결할 수 있습니다. –