Pyspark使用take/collect方法报错TypeError: a bytes-like object is required
PySpark 类型不匹配报错原因说明
直接触发原因
调用sc.textFile()时设置了use_unicode=False,该参数会让读取的RDD每行数据返回为bytes类型而非默认的字符串类型,后续解析操作中存在字符串与bytes类型混用的逻辑,触发类型校验错误。
具体错误场景
你的ParseReader解析函数中存在类似如下的错误写法:
def ParseReader(line): # line是bytes类型,传入str类型的','作为分隔符调用split方法,直接触发报错 fields = line.split(',') return Captain(*fields)
bytes对象的split方法要求传入的分隔符必须也是bytes类型,传入str类型的分隔符就会抛出TypeError: a bytes-like object is required, not 'str'。
如果已经将分隔符替换为b',',还需要确认是否存在将bytes类型的字段直接赋值给预期为字符串的业务逻辑,PySpark序列化RDD数据时的类型转换也可能触发同类报错。
修复方案
- 方案1:保留
use_unicode=False配置,调整解析逻辑适配bytes类型:def ParseReader(line): fields = line.split(b',') # 按需将bytes解码为字符串 fields = [item.decode('utf-8') for item in fields] return Captain(*fields) - 方案2:删除
use_unicode=False配置,使用sc.textFile默认行为直接返回str类型的行数据,无需额外类型适配。
内容的提问来源于stack exchange,提问作者Arihant Kamdar
相关产品推荐
相关产品推荐

