首页 文章

使用SDK在Azure功能中使用Azure blob存储到JSON

提问于
浏览
0

我正在尝试创建一个计时器触发器azure函数,该函数从blob获取数据,聚合它,并将聚合放在cosmosDB中 . 我之前尝试使用azure函数中的绑定来使用blob作为输入,我被告知这是不正确的(请参阅此主题:Azure functions python no value for named parameter) .

我现在正在使用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)

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

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

即使我添加 if_modified_since 仅仅采用一个blob,也会发生这种情况 . 如果我弄明白的话会更新 . 随时欢迎帮助 .


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

1 回答

  • 0

    弄清楚了 . 最后这是一个非常简单的修复:

    我必须确保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))
    

    从这里你可以添加到数据框并做你想做的事情:)希望这有助于如果有人偶然发现类似的问题 .

相关问题