Как я могу объединить json данных в массиве, но агрегировать данные по минутам? - PullRequest
1 голос
/ 16 марта 2020

Я пишу azure функцию, где я получаю данные из Azure StreamAnalytics и отправляю их в реляционную базу данных. После нескольких месяцев тестирования этой функции рост базы данных был безумным. Я пишу 300 000 строк данных каждый день, и это только из 1 источника данных. Теперь я хочу агрегировать данные, которые я получаю за минуту, и получить среднее значение этой минуты. После исследования того, как собрать json данных, я не смог найти статью, которая могла бы мне помочь.

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

[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestMessage req,
            ILogger log)
        {
            NpgsqlConnectionStringBuilder builder = new NpgsqlConnectionStringBuilder
            {
                Host = "test",
                Username = "test",
                Password = "test",
                Database = "test",
            };

            using (NpgsqlConnection connection = new NpgsqlConnection(builder.ConnectionString))
            {
                connection.Open();
                if (connection != null && connection.State == ConnectionState.Open)
                {
                    string content = await req.Content.ReadAsStringAsync();
                    dynamic result = JsonConvert.DeserializeObject(content);

                    foreach (var data in result)
                    {
                        Machine machine = new Machine
                        {
                            Id = data.data.sID,
                            Path = data.data.sXPath,
                            Type = data.data.sType,
                            MeasurementTimestamp = data.data.dtTimeStamp,
                        };

                        foreach (JProperty items in data.data.items)
                        {
                            string[] split = Regex.Split(items.Name, @"(?<!^)(?=[A-Z])");
                            string dataType = machine.GetDataType(split[0]);
                            string measurementValue = (string)items.Value;

                            if (!machine.MeasurementTypeExists(items.Name, dataType, connection))
                            {
                                machine.AddMeasurementType(items.Name, dataType, connection);
                            }

                            int typeId = machine.GetTypeID(machine.Type, connection);

                            if(machine.MachineExists(machine.Id, connection) && machine.MeasurementTypeExists(items.Name, dataType, connection) && machine.PointOfMeasurementExists(machine.Id, typeId, machine.Path, connection))
                            {
                                int measurementTypeId = machine.GetMeasurementTypeID(items.Name, dataType, connection);
                                int pointOfMeasurementId = machine.GetPointOfMeasurementID(machine.Path, machine.Id, typeId, connection);

                                // Miliseconds
                                machine.AddMeasurementMs(measurementValue, machine.MeasurementTimestamp, machine.Id, measurementTypeId, pointOfMeasurementId, connection);


                                // Minutes
                                machine.AddMeasurementMin(measurementValue, machine.MeasurementTimestamp, machine.Id, measurementTypeId, pointOfMeasurementId, connection);
                            }
                        }
                    }
                }
            }
            return req.CreateResponse(HttpStatusCode.OK, "Executed");
        }
    }

Как я могу агрегировать данные json для хранения среднего значения минуты, используя мою функцию AddMeasurementMin? Любой пу sh в правильном направлении мне поможет.

1 Ответ

2 голосов
/ 16 марта 2020

Я буду хранить дату и минуты в двух отдельных полях в вашей базе данных, а затем вы сможете использовать запросы для агрегирования записей в минуту и ​​вычисления nros записей.

Из вашего кода вам нужно использовать метку времени, чтобы получить минуты, поэтому вы можете быстро сделать что-то вроде этого

var entryDate = new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(machine.MeasurementTimestamp);

// Minutes
machine.AddMeasurementMin(measurementValue, entryDate.Minute, machine.Id, measurementTypeId, pointOfMeasurementId, connection);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...