使用python azure事件中心中的事件

使用python azure事件中心中的事件,python,azure,azure-eventhub,Python,Azure,Azure Eventhub,我正在事件中心接收JSON数据 我想每天从event hub读取一次数据,并将其存储在数据库中。为了从事件中心读取数据,我遵循以下文档: 我能够打印事件中心中的所有事件,但我不知道如何获取这些事件并在此函数之外返回一个数据帧 我试过这个: 事件批处理上的def(分区上下文、事件): final_dataframe=pd.dataframe() 打印(“从分区{}接收到的事件”。格式(分区\上下文。分区\ id)) 对于事件中的事件: body=json.load(下一个(event.body)

我正在事件中心接收JSON数据

我想每天从event hub读取一次数据,并将其存储在数据库中。为了从事件中心读取数据,我遵循以下文档:

我能够打印事件中心中的所有事件,但我不知道如何获取这些事件并在此函数之外返回一个数据帧

我试过这个:


事件批处理上的def(分区上下文、事件):
final_dataframe=pd.dataframe()
打印(“从分区{}接收到的事件”。格式(分区\上下文。分区\ id))
对于事件中的事件:
body=json.load(下一个(event.body).decode('UTF-8'))
事件\ u df=pd.DataFrame(主体,索引=[0])
final\u dataframe=pd.concat([final\u dataframe,event\u df],ignore\u index=True)
分区\上下文。更新\检查点()
client.close()
打印(最终数据帧)
返回最终数据帧
与客户:
最终数据帧=client.receive\u批(
on_event_batch=on_event_batch,
起始_position=“-1”,#“-1”是从分区的开始。
)
#从指定分区接收事件:
#client.receive\u batch(on\u event\u batch=on\u event\u batch,分区\u id='0')
但它不工作。

返回类型为“无”。我不确定您是否能够通过在回调函数中执行返回来实现这一点

然而,我认为更简单的方法如下

from azure.eventhub import EventHubConsumerClient
import pandas as pd
import json



def get_messages() :
    connection_str = '<YOUR CONNECTION STRING>'
    consumer_group = '<YOUR CONSUMER GROUP>'
    eventhub_name = '<YOUR EVENT HUB>'
    client = EventHubConsumerClient.from_connection_string(connection_str, consumer_group, eventhub_name=eventhub_name)

    final_df = pd.DataFrame()
    def on_event_batch(partition_context, events):
        print("Received event from partition {}".format(partition_context.partition_id))
        print(len(events))
        #Checking whether there is any event returned as we have set max_wait_time
        if(len(events) == 0):
        #closing the client if there is no event triggered.
            client.close()
            
        else:
        
            for event in events:
                #Event.body operation
                body=event.body
                event_df  = pd.DataFrame(body,index = [0])
                nonlocal final_df
                final_df = pd.concat([final_df,event_df],ignore_index= True)
                partition_context.update_checkpoint()

    with client:
        client.receive_batch(
            on_event_batch=on_event_batch, 
            starting_position="-1",max_wait_time = 5,max_batch_size=2  # "-1" is from the beginning of the partition. 
            #Max_wait_time - no activitiy for that much - call back function is called with No events.
        )
    return final_df


df = get_messages()
df.head()
从azure.eventhub导入EventHubConsumerClient
作为pd进口熊猫
导入json
def get_消息():
连接\u str=''
消费者组=“”
eventhub_名称=“”
client=eventhubcumerclient.from\u connection\u string(connection\u str,consumer\u group,eventhub\u name=eventhub\u name)
final_df=pd.DataFrame()
事件批处理上的def(分区上下文、事件):
打印(“从分区{}接收到的事件”。格式(分区\上下文。分区\ id))
打印(镜头(事件))
#检查是否有任何事件返回,因为我们已设置了最大等待时间
如果(len(events)==0):
#如果未触发任何事件,则关闭客户端。
client.close()
其他:
对于事件中的事件:
#事件体操作
body=event.body
事件\ u df=pd.DataFrame(主体,索引=[0])
非局部最终值
final\u df=pd.concat([final\u df,event\u df],ignore\u index=True)
分区\上下文。更新\检查点()
与客户:
client.receive\u批处理(
on_event_batch=on_event_batch,
start_position=“-1”、max_wait_time=5、max_batch_size=2、“-1”是从分区开始的。
#Max_wait_time-没有那么多的活动-回调函数在没有事件的情况下被调用。
)
返回最终值
df=获取消息()
df.head()
上述代码将在正常退出后实际设置数据帧df的值


非常好的解决方案@Satya V,我将添加一个替换
body=event.body\u作为\u json()
和event\u df=pd.DataFrame(body.T),您将拥有一个完美的数据框架,所有值都位于不同的列中。