繁体   English   中英

使用SDK在Azure函数中将Azure Blob存储到JSON

[英]Azure blob storage to JSON in azure function using SDK

我正在尝试创建一个计时器触发azure函数,该函数从blob中获取数据,对其进行聚合,然后将这些聚合放入cosmosDB中。 我以前曾尝试在azure函数中使用绑定来将blob用作输入,但我被告知是不正确的(请参见此线程: Azure函数python命名参数没有值 )。

我现在正在使用SDK,并且遇到以下问题:

import sys, os.path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), 'myenv/Lib/site-packages')))
import json
import pandas as pd
from azure.storage.blob import BlockBlobService 

data = BlockBlobService(account_name='accountname', account_key='accountkey')
container_name = ('container')
generator = data.list_blobs(container_name)

for blob in generator:
print("{}".format(blob.name))
json = json.loads(data.get_blob_to_text('container', open(blob.name)))


df = pd.io.json.json_normalize(json)
print(df)

这会导致错误:

IOError: [Errno 2] No such file or directory: 'test.json'

我意识到这可能是绝对路径问题,但是我不确定这在Azure存储中如何工作。 关于如何规避这一点的任何想法?


通过执行以下操作使其“起作用”:

for blob in generator:
loader = data.get_blob_to_text('kvaedevdystreamanablob',blob.name,if_modified_since=delta)
json = json.loads(loader.content)

这适用于一个json文件,即我在存储中只有一个json文件,但是当添加更多文件时,出现此错误:

ValueError: Expecting object: line 1 column 21907 (char 21906)

即使我将if_modified_since添加为仅吸收一个blob, if_modified_since发生这种情况。 如果我知道有什么会更新。 随时欢迎您的帮助。


另一个更新:我的数据通过流分析进入,然后到达Blob。 我选择将数据作为数组输入,这就是发生错误的原因。 当流终止时,blob不会立即将]追加到json中的EOF行,因此json文件无效。 现在将尝试在流分析中使用逐行而不是数组。

弄清楚了。 最后,这是一个非常简单的解决方案:

我必须确保Blob中的每个json条目少于1024个字符,否则它将创建新行,从而使读取行成为问题。

遍历每个blob文件,读取并添加到列表的代码如下:

data = BlockBlobService(account_name='accname', account_key='key')
generator = data.list_blobs('collection')

dataloaded = []
for blob in generator:
loader = data.get_blob_to_text('collection',blob.name)
trackerstatusobjects = loader.content.split('\n')
for trackerstatusobject in trackerstatusobjects:
    dataloaded.append(json.loads(trackerstatusobject))

由此,您可以添加到数据框并执行您想做的任何事情:)希望这在有人偶然遇到类似问题时有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM