如何在SageMaker中将S3上的大型JSON文件读取为DataFrame并解决运行报错
报错原因与解决方法
报错原因
你遇到的sequence item 0: expected str instance, bytes found报错核心有两个:
- 代码存在变量名大小写笔误:你提前初始化的列表变量为
dflist,但循环中追加数据时写的是dfList,大小写不匹配会导致后续列表拼接异常(这不是你当前触发该报错的直接原因,但也需要修正) - 核心问题是pandas直接读取S3路径的JSON文件时,底层依赖的s3fs库部分版本默认以二进制模式拉取文件内容,没有自动解码为字符串,和
read_json预期的字符串输入类型不匹配
解决方法
方案1:直接添加编码参数(修改量最小)
修正变量名的同时,在pd.read_json中添加encoding='utf-8'指定解码规则即可,修改后代码如下:
from sagemaker import get_execution_role import pandas as pd bucket = 'xxx' data_key = 'TV.json' data_location = 's3://{}/{}'.format(bucket, data_key) textfilereader=pd.read_json( data_location,lines=True,chunksize=1000, encoding='utf-8') dflist=[] for df in textfilereader: dflist.append(df) df=pd.concat(dflist,sort=False)
方案2:显式用文本模式打开S3文件(兼容性更强)
如果方案1依然报错,可以用s3fs库显式以文本模式打开文件,避免默认二进制模式的问题,SageMaker环境默认已预装s3fs,无需额外安装,代码如下:
from sagemaker import get_execution_role import pandas as pd import s3fs bucket = 'xxx' data_key = 'TV.json' data_location = 's3://{}/{}'.format(bucket, data_key) # 初始化s3文件系统,以utf-8文本模式打开文件 fs = s3fs.S3FileSystem() dflist=[] with fs.open(data_location, 'r', encoding='utf-8') as f: textfilereader=pd.read_json(f, lines=True, chunksize=1000) for df in textfilereader: dflist.append(df) df=pd.concat(dflist,sort=False)
内容的提问来源于stack exchange,提问作者Achillies
相关产品推荐
相关产品推荐

