如何在Spark RDD Row对象中将空字符串替换为0?
解决RDD Row中空字符串转0的问题
要把RDD Row里的空字符串(比如那些延迟类字段的空值)转换成0,你可以写一个轻量的辅助函数处理转换逻辑,再在构造Row对象时对目标字段应用这个函数。下面是具体实现方案:
1. 定义空值转换函数
先写一个通用函数,判断字段是否为空字符串,是空则返回0,否则转为整数(因为这些字段都是数值类型):
def convert_empty_to_zero(value): # 先去除两端空白,避免空格导致的误判 return 0 if value.strip() == "" else int(value)
2. 修改Row构造逻辑
在你原有的代码基础上,对所有可能为空的数值型字段(比如DEPARTURE_DELAY、AIR_SYSTEM_DELAY等)应用上面的转换函数,字符串类型字段(如AIRLINE、CANCELLATION_REASON)保持原有处理逻辑即可。
修改后的完整代码如下:
from pyspark.sql import Row def convert_empty_to_zero(value): return 0 if value.strip() == "" else int(value) def import_parse_rdd(data): # 读取文件创建RDD rdd = sc.textFile(data) # 移除表头 header = rdd.first() rdd = rdd.filter(lambda row: row != header) # 按逗号分割每行数据 split_rdd = rdd.map(lambda line: line.split(',')) # 映射为Row对象并处理空值 row_rdd = split_rdd.map(lambda line: Row( YEAR = int(line[0]),MONTH = int(line[1]),DAY = int(line[2]),DAY_OF_WEEK = int(line[3]), AIRLINE = line[4],FLIGHT_NUMBER = int(line[5]), TAIL_NUMBER = line[6],ORIGIN_AIRPORT = line[7],DESTINATION_AIRPORT = line[8], SCHEDULED_DEPARTURE = line[9],DEPARTURE_TIME = line[10], DEPARTURE_DELAY = convert_empty_to_zero(line[11]), TAXI_OUT = convert_empty_to_zero(line[12]), WHEELS_OFF = line[13],SCHEDULED_TIME = convert_empty_to_zero(line[14]), ELAPSED_TIME = convert_empty_to_zero(line[15]), AIR_TIME = convert_empty_to_zero(line[16]), DISTANCE = convert_empty_to_zero(line[17]), WHEELS_ON = line[18],TAXI_IN = convert_empty_to_zero(line[19]), SCHEDULED_ARRIVAL = line[20],ARRIVAL_TIME = line[21], ARRIVAL_DELAY = convert_empty_to_zero(line[22]), DIVERTED = convert_empty_to_zero(line[23]), CANCELLED = convert_empty_to_zero(line[24]), CANCELLATION_REASON = line[25], AIR_SYSTEM_DELAY = convert_empty_to_zero(line[26]), SECURITY_DELAY = convert_empty_to_zero(line[27]), AIRLINE_DELAY = convert_empty_to_zero(line[28]), LATE_AIRCRAFT_DELAY = convert_empty_to_zero(line[29]), WEATHER_DELAY = convert_empty_to_zero(line[30]) )) return row_rdd
额外说明
- 所有原本为空的数值字段都会被转换成0,比如你示例数据里的
AIR_SYSTEM_DELAY等字段,处理后就会从空字符串变为0。 - 如果你的数据里不存在带空格的空值(比如
" "),可以去掉strip()直接判断value == "",简化函数逻辑。 - 字符串类型字段保持原样,因为这类字段的空值不需要转为数字。
内容的提问来源于stack exchange,提问作者jixubi
相关产品推荐
相关产品推荐

