使用SAS从Azure Data Lake读取sklearn模型触发UnicodeDecodeError如何解决
问题原因
joblib的load()方法默认优先把传入的参数判定为本地文件路径字符串,你传入从Azure Blob下载得到的二进制字节内容后,load()会尝试将其作为路径字符串用UTF-8解码,而joblib模型文件本身是二进制序列化格式,包含大量非UTF-8编码的字节,因此触发解码报错。
解决方案
不需要额外写入本地磁盘,只要把二进制字节内容包装为BytesIO类文件对象,再传给load()即可,修改后的代码如下:
from io import BytesIO from azure.storage.blob import BlobClient from joblib import load SAS_URL = "https://XXXX" blob_client = BlobClient.from_blob_url(SAS_URL) downloader = blob_client.download_blob() # 读取二进制内容并包装为BytesIO对象 model_bytes = downloader.readall() loaded_model = load(BytesIO(model_bytes))
如果有本地存储的需求,也可以先将模型文件下载到本地路径,再传入路径字符串到load()方法读取,代码如下:
from azure.storage.blob import BlobClient from joblib import load SAS_URL = "https://XXXX" blob_client = BlobClient.from_blob_url(SAS_URL) # 下载到本地文件 with open("local_model.joblib", "wb") as f: blob_client.download_blob().readinto(f) # 从本地路径加载 loaded_model = load("local_model.joblib")
内容的提问来源于stack exchange,提问作者Luis Ramon Ramirez Rodriguez
相关产品推荐
相关产品推荐

