2015-07-02 3 views
1

Я пытаюсь прочитать экспорт приложений в таблицу SQL с помощью анализа потока.Application Insights и Azure Stream Analytics Запросить пользовательское свойство JSON

Это Обычаи и метрические события Я пытаюсь захватить поэтому часть JSON является «имя» обычая или метрическую события (например, TestMethod1) и JSON выглядит следующим образом:

{ 
    "metric": [ ], 
    "internal": 
    .. host of other json data... 
    "context": { 
     "custom": { 
     "metrics": 
     [ 
     { 
      "TestMethod1": 
      { 
      "value": 42.8207, 
      "count": 1.0, 
      "min": 42.8207, 
      "max": 42.8207, 
      "stdDev": 0.0 
      } 
     } 
     ] 
    } 
    } 
} 

Использование аналитики Sql, как язык, я стараюсь и передавать свои данные в SQL таблицу, используя синтаксис, аналогичный ниже (это до сих пор мне пробовать различные способы и средства для достижения этой цели ...)

SELECT A.internal.data.id as id 
, dimensions.ArrayValue.EventName as eventName 
, metrics.[value] as [value] 
, A.context.data.eventTime as eventtime 
, metrics.count as [count] 
INTO 
    MetricsOutput 
FROM AppMetrics A 
CROSS APPLY GetElements(A.[context].[custom].[metrics[0]]) as metrics 
CROSS APPLY GetElements(A.[context].[custom].[dimensions]) as dimensions 

проблема заключается в том, из-за к имени настраиваемого события, ни мои столбцы [значение], ни [счет] не являются popu веден. На данный момент я получаю сообщение об ошибке «столбец с таким именем не существует» на metrics.value.

Любые идеи о том, как я могу это достичь?

Я хочу вывести мои показатели и пользовательские события для нескольких разных методов, а имя столбца не важно. но один blob-файл из экспорта приложений будет содержать события для 5 или 6 различных пользовательских событий и показателей.

Таким образом, у меня может быть один файл blob, содержащий TestMethod1, TestMethod2 и TestMethod3, и вы хотите разобрать этот файл в таблице, не прибегая к коду и рабочей роли.

С уважением

+0

http://stackoverflow.com/ вопросов/ 31528147/export-custom-event-dimensions-to-sql-from-application-insights-using-stream-ana – Riccardo

+0

Существует аналогичный вопрос с ответом здесь: http://stackoverflow.com/questions/31602577/accessing- array-elements-in-azure-stream-analytics Ziv. –

ответ

1

Вы «не хотите использовать CROSS APPLY для размеров, потому что тогда он поставит каждое измерение на другой строке. Вы хотите сгладить все в одну строку. Для этого используйте приведенные ниже функции GetRecordPropertyValue и GetArrayElement. Формат

JSON:

{ 
    "event": [{...}], 
    "internal": {...}, 
    "context": { 
     ... 
     "data": { 
      "isSynthetic": false, 
      "eventTime": "2015-12-14T17:38:35.37Z", 
      "samplingRate": 100.0 
     }, 
     ... 
     "custom": { 
      "dimensions": 
      [ 
       { "MyDimension1": "foo" }, 
       { "MyDimension2": "bar" } 
      ], 
      "metrics": [{ 
       "MyMetric1": { 
        "value": 0.39340400471142523, 
        "count": 1.0, 
        "min": 0.39340400471142523, 
        "max": 0.39340400471142523, 
        "stdDev": 0.0 
       } 
      }] 
     }, 
     ... 
    } 
} 

Запрос:

SELECT 
    MySource.internal.data.id AS ID, 
    MySource.context.data.eventTime AS EventTime, 
    GetRecordPropertyValue(GetArrayElement(MySource.context.custom.dimensions, 0), 'MyDimension1') AS MyDimension1, 
    GetRecordPropertyValue(GetArrayElement(MySource.context.custom.dimensions, 1), 'MyDimension2') AS MyDimension2, 
    avg(CASE WHEN MyMetrics.arrayvalue.MyMetric1.value IS NULL THEN 0 ELSE MyMetrics.arrayvalue.MyMetric1.value END) as MetricAverage 
INTO 
    [output-stream] 
FROM 
    [input-stream] MySource 
OUTER APPLY 
    GetElements(MySource.context.custom.metrics) as MyMetrics 
GROUP BY 
    SlidingWindow(minute, 1), 
    MySource.internal.data.id AS ID, 
    MySource.context.data.eventTime AS EventTime, 
    GetRecordPropertyValue(GetArrayElement(MySource.context.custom.dimensions, 0), 'MyDimension1'), 
    GetRecordPropertyValue(GetArrayElement(MySource.context.custom.dimensions, 1), 'MyDimension2') 
+3

Что делать, если MyDimension1 может иметь другую позицию в массиве измерений? Вы знаете, что это довольно стандартный сценарий, если у вас есть настройки свойств, которые варьируются от одного события к другому. –

1

Для Пользовательские параметры, которые будут добавлены в виде столбцов в одной строке, это работает для меня:

Под «Топология работы -> Функции» раздел «Работа аналитика потока».

Во-первых,

добавить пользовательскую функцию со следующими свойствами

  • Функция Алиас - flattenCustomDimensions (может быть любым)
  • Функция Тип - Javascript UDF
  • Тип выхода - любой

И заменить главную функцию со следующим

function main(dimensions) { 
    let output = {}; 
    for(let i in dimensions) { 
    let dim = dimensions[i]; 
    for(let key in dim) { 
     output[key] = dim[key]; 
    } 
    } 
    return output; 
} 

Add custom function

Во-вторых,

Форма запроса следующим образом:

Если у нас есть собственные размеры

Стр1:

"context": { 
    ... 
    "custom": { 
    "dimensions": [ 
     { "Dimension1": "Value1" }, 
     { "Dimension2": "Value2" } 
    ] 
    } 
} 

Стр2:

"context": { 
    ... 
    "custom": { 
    "dimensions": [ 
     { "Dimension1": "Value1.2" }, 
     { "Dimension3": "Value3" } 
    ] 
    } 
} 

Запрос будет

WITH temp as (
SELECT 
    *, 
    UDF.flattenCustomDimensions(I.context.custom.dimensions) as dim 
    FROM [Input] as I 
) 

SELECT 
    Dim1 = temp.dim.Dimension1, 
    Dim2 = temp.dim.Dimension2, 
    Dim3 = temp.dim.Dimension3 
INTO [Output] 
FROM temp 

В таблице вывода будет

DIM1  | DIM2 | DIM3 
---------------------------- 
Value1 | Value2 | null 
Value1.2 | null | Value3 
+0

Спасибо, это было прекрасно! – Lukos

Смежные вопросы