Анализ массива, переданного как объект, в C# UDF для Azure Stream Analytics - PullRequest
0 голосов
/ 05 мая 2020

Это релевантная часть файла JSON. Я пытаюсь передать значения определенному пользователем сценарию для обработки

{
"FragCount": 63,
"ValueMapping": 7,
"DataType": 19,
"BurstId": 85,
"SensorNodeId": "bd8e8077",
"Values": [
  23,
  -3,
  20,
  31,
  51,
  -3,
  -14,
  -4,
  47,
  31,
  52,
  -3,
  2,
  -3,
  42,
  31,
  49,
  -3,
  -18,
  -4,
  -10,
  30,
  47,
  -3,
  -29,
  -4,
  55,
  31,
  27,
  -3,
  -24,
  -4,
  11,
  31,
  -32,
  -4,
  -38,
  -4,
  -18,
  30,
  -20,
  -4,
  -76,
  -4,
  -42,
  30,
  -59,
  -4,
  -81,
  -4,
  45,
  31,
  -79,
  -4,
  -75,
  -4,
  19,
  31,
  -93,
  -4,
  -99,
  -4,
  -40,
  30,
  -122,
  -4,
  -90,
  -4,
  -70,
  30,
  -128,
  -4,
  -92,
  -4,
  -112,
  30,
  119,
  -4,
  -91,
  -4,
  -46,
  30,
  120,
  -4,
  -49,
  -4,
  -61,
  30,
  87,
  -4,
  -43,
  -4,
  -27,
  30,
  61,
  -4
],

Запрос Stream Analytics выглядит так:

WITH ReaderQuery AS (
SELECT
    *
FROM
    [IoT-Hub]
)


SELECT
       SensorNodeId AS SensorID,
       FragCount AS FragCount,
       ValueMapping AS ValueMapping,
       DataType AS DataType,
       BurstId AS BurstId,
       udf.FFTDecompressor_Class1_FFTDecomFunc(try_cast([Values] as Array)) AS [Values],
       MeasurementId AS MeasurementId

  INTO
       [FFT]
  FROM
       ReaderQuery
       WHERE ( DataType = 19 )

Это пользовательская функция. Я действительно не могу понять, как мне преобразовать значения в объекте b в целочисленный список или массив для обработки.

 using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using System.Text;

   namespace FFTDecompressor
   {
    public class Class1
     {


    // Public static function
    public static String FFTDecomFunc(Object b)
    {
        //int[] a = Array.ConvertAll<object, int>(b.ToArray(), (o) => (int)o);
        //List<int> a = b.Split(',').Select(s => int.Parse(s)).ToList();
        List<int> FFTList = new List<int>();
        String DecompressedValues = null;

        for (int i = 0; i < a.Count; i++)
        {

            if (i == 0)
            {
                FFTList.Add(BitConverter.ToUInt16(new[] { Convert.ToByte(a[i]), Convert.ToByte(a[i +1]), }, 0));
                FFTList.ForEach(x => Console.WriteLine(x));
                i++;
            }
            else
            {
                if (a[i] == -128)
                {
                    FFTList.Add(BitConverter.ToUInt16(new[] { Convert.ToByte(a[i + 1]), 
                    Convert.ToByte(a[i + 2]), }, 0));
                    i += 2;
                }
                else
                {

                    if (FFTList.Count == 1)
                    {
                        FFTList.Add(FFTList[0] + a[i]);
                    }
                    else
                    {
                        FFTList.Add(FFTList[(FFTList.Count - 1)] + a[i]);
                    }
                }

            }

        }

        /*
        for (int i = 0; i < FFTList.Count; ++i)
        {
            FFTList[i] /= 100;
        }
        */
        DecompressedValues = string.Join(",", FFTList);  


        return DecompressedValues;
    }
   }
  }

1 Ответ

0 голосов
/ 08 мая 2020

Если вы знаете, что ваш ввод является массивом, вам не нужно приводить его к типу Array. Вот что вы можете сделать вместо этого. Вы можете запросить:

SELECT udf.sampleASAproject_Class1_sampleudf([Values]) from Input

И мой пример C# UDF (Codebehind в моем случае) возвращает преобразование массива в тип Int64 и возвращает первое значение:

using System;
using System.Linq;

namespace sampleASAproject
{
    public class Class1
    {
        // Public static function
        public static Int64 sampleudf(Object[] data)
        {
            Int64[] arrayInteger = data.Cast<Int64>().ToArray();
            return arrayInteger[0];
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...