Azure 将两个分区流合并为一个流

Azure 将两个分区流合并为一个流,azure,streaming,azure-eventhub,Azure,Streaming,Azure Eventhub,我是Azure事件中心的新手。通过事件中心,我们从物联网设备接收数据,并通过分配分区号0和1将数据分为两个流 我们需要两条流的原因是,一条流用于培训深度学习模型,另一条流用于使用来自另一端的新数据测试我们培训的模型 这就是所谓的在线学习 然而,在我们还没有训练模型的情况下,我们无法用模型对其进行测试,因此在这种情况下,我宁愿将两个分区流合并为一个,这样就不会浪费数据。稍后,一旦创建了模型,我们就可以同时返回两个流进行测试和训练 我找不到任何能够在事件中心脚本中组合它们的模块。有什么建议吗 如果可

我是Azure事件中心的新手。通过事件中心,我们从物联网设备接收数据,并通过分配分区号0和1将数据分为两个流

我们需要两条流的原因是,一条流用于培训深度学习模型,另一条流用于使用来自另一端的新数据测试我们培训的模型

这就是所谓的在线学习

然而,在我们还没有训练模型的情况下,我们无法用模型对其进行测试,因此在这种情况下,我宁愿将两个分区流合并为一个,这样就不会浪费数据。稍后,一旦创建了模型,我们就可以同时返回两个流进行测试和训练


我找不到任何能够在事件中心脚本中组合它们的模块。有什么建议吗

如果可以在发送到事件中心期间向数据添加属性,则可以尝试以下步骤

1.我们需要为每个事件数据设置2个属性

对于测试数据,我们可以添加以下两个属性:

属性_name:category,其velue:test,用于确定您正在接收的数据类型,如测试数据或火车数据

property_name:seqNum,其值为number,类似于0,1,2,3,用于确定数据的顺序

对于列车数据,使用上述步骤,只需将类别值更改为train

我在c代码中设置了这些属性,如下所示。您可以通过自己的方式进行设置,无需c:

        for (var i = 0; i < numMessagesToSend; i++)
        {                
                var message = "555 Message";
                EventData mydata = new EventData(Encoding.UTF8.GetBytes(message));

                //add properties
                mydata.Properties.Add("seqNum", i);
                mydata.Properties.Add("category", "test");
                await eventHubClient.SendAsync(mydata);

         }
试验结果如下:


最后一步,由于测试数据/序列数据分别存储在字典中,且dict的键是序列号,因此您可以编写代码以按顺序操作dict、重建的测试数据/序列数据。

何时要组合这两个流?在发送或接收过程中?@IvanYang Hi:这些都是在接收后组合的。它使用的是python代码吗?您希望如何组合,比如在接收后将测试流附加到培训流?@IvanYang噢,看起来您已经找到了解决方案。是的,我想附加这两个队列。如你们所知,若我们不在producer中分配分区号,它会自动分成两个流,一组奇数顺序,另一组偶数顺序。我希望它们在拆分之前保持原始格式。如果您没有发送这些数据,那么我记得在发送数据时可以添加一个属性字段,MS建议我们可以使用该属性来了解这些数据的顺序。
import logging
import asyncio
import os
import sys
import signal
import functools

from azure.eventprocessorhost import (
    AbstractEventProcessor,
    AzureStorageCheckpointLeaseManager,
    EventHubConfig,
    EventProcessorHost,
    EPHOptions
)

# define 2 dictionaries, to store test data and train data respectively.
dict_test={}
dict_train={}

class EventProcessor(AbstractEventProcessor):

    def __init__(self, params=None):       
        super().__init__(params)
        self._msg_counter = 0

    async def open_async(self, context):        
        print("Connection established {}".format(context.partition_id))

    async def close_async(self, context, reason):

        print("Connection closed (reason {}, id {}, offset {}, sq_number {})".format(
            reason,
            context.partition_id,
            context.offset,
            context.sequence_number))

    async def process_events_async(self, context, messages):

        for m in messages:
            data = m.body_as_str()
            if m.application_properties is not None:
                mycategory = m.application_properties.get(b'category').decode('utf-8')
                mysequence = str(m.application_properties.get(b'seqNum'))                

                if mycategory == 'test':
                    dict_test[mysequence]=data

                if mycategory == 'train':
                    dict_train[mysequence]=data

                print("Received data: {}".format(data))
        await context.checkpoint_async()

    async def process_error_async(self, context, error):

        print("Event Processor Error {!r}".format(error))


async def wait_and_close(host):

    await asyncio.sleep(60)
    await host.close_async()

try:
    loop = asyncio.get_event_loop()

    # Storage Account Credentials
    STORAGE_ACCOUNT_NAME = "xxx"
    STORAGE_KEY = "xxxx"
    LEASE_CONTAINER_NAME = "xxx"
    NAMESPACE = "xxx"
    EVENTHUB = "xxx"
    USER = "RootManageSharedAccessKey"
    KEY = "xxxx"

    # Eventhub config and storage manager 
    eh_config = EventHubConfig(NAMESPACE, EVENTHUB, USER, KEY, consumer_group="$default")
    eh_options = EPHOptions()
    eh_options.release_pump_on_timeout = True
    eh_options.debug_trace = False
    storage_manager = AzureStorageCheckpointLeaseManager(
        STORAGE_ACCOUNT_NAME, STORAGE_KEY, LEASE_CONTAINER_NAME)

    # Event loop and host
    host = EventProcessorHost(
        EventProcessor,
        eh_config,
        storage_manager,
        ep_params=["param1","param2"],
        eph_options=eh_options,
        loop=loop)



    tasks = asyncio.gather(
        host.open_async(),
        wait_and_close(host))
    loop.run_until_complete(tasks)

    print("***this is the data for test***")
    print(dict_test)
    print("***-----------------------***")
    print("***this is the data for train***")
    print(dict_train)

except KeyboardInterrupt:
    # Canceling pending tasks and stopping the loop
    for task in asyncio.Task.all_tasks():
        task.cancel()
    loop.run_forever()
    tasks.exception()

finally:
    loop.stop()