调用persist()后无法打印RDD元素,报object does not support item assignment错误
错误原因
- Python中字符串为不可变对象,无法通过下标
row[i]直接修改字符串内容,你代码中row[i]='0'的操作是触发object does not support item assignment报错的直接原因。 - 代码逻辑存在错位:你想要替换的是日志最后一列(传输大小)的
-为0,但你判断的是原始日志字符串最后一位为-,且尝试修改原始字符串而非分割后的字段,就算字符串支持修改也无法实现预期功能。 - 潜在逻辑漏洞:直接按空格分割日志会把请求行中
GET和路径之间的空格也作为分割符,导致字段错位,后续取items2[5]会出现下标越界或取值错误的问题。
修复方案
修正后的完整代码如下:
import re def process_row(row): # 移除转义符" cleaned_row = row.replace('"', '') # 正则匹配NASA标准日志字段,规避请求路径内空格的干扰 log_pattern = r'(\S+) \[([^\]]+)\] "([^"]+)" (\d+) (\S+)' match_result = re.match(log_pattern, cleaned_row) # 过滤匹配失败的脏数据 if not match_result: return None host, request_time, request_content, status_code, size = match_result.groups() # 处理传输大小字段的'-'缺失值 size = 0 if size == '-' else int(size) return [host, request_time, request_content, status_code, size] # 处理日志并过滤脏数据 nasa = nasa_raw.map(process_row).filter(lambda x: x is not None) nasa.persist() # 直接取前10条,无需全量拉取数据到本地 first10 = nasa.take(10) for idx, line in enumerate(first10): print(f'Line {idx+1:02}: {line}')
主要修改点:
- 移除了修改不可变字符串的错误操作,针对需要替换的传输大小字段单独做缺失值处理
- 改用正则表达式匹配日志字段,适配NASA日志格式,避免空格分割导致的字段错位问题
- 用
take(10)替代collect()[:10],不需要全量拉取RDD数据到本地,大幅提升大数据量下的执行效率 - 增加脏数据过滤逻辑,避免异常格式的日志行导致任务中断
内容的提问来源于stack exchange,提问作者user1997567
相关产品推荐
相关产品推荐

