PySpark转换温度为华氏度时字符串转float报错如何解决
报错原因分析
- 最核心的原因是你读取的CSV文件自带表头行,首行下标为3的字段值就是
"r_version",属于文本类表头内容,并非温度数值,直接转float就会触发对应报错。你当前使用sc.textFile读取文件时会加载所有行内容,不会自动跳过表头。 - 部分数据行的温度字段可能被双引号包裹(比如值为
"256"而非256),未清理引号就直接转换也会触发类型错误。 - 少数脏行可能存在字段缺失、分隔错位的问题,导致下标3的位置对应的不是预设的温度数值字段。
需要补充的处理步骤
- 跳过表头行,你可以二选一实现:
方案1:手动过滤首行表头
方案2:改用PySpark原生CSV读取接口,自动处理表头、引号、类型映射,比手动split更稳妥:# 读取全量行后取首行作为表头,过滤掉表头行 lines = sc.textFile("<file>") header = lines.first() lines = lines.filter(lambda line: line != header)from pyspark.sql import SparkSession spark = SparkSession.builder.appName("tempConvert").getOrCreate() # header=True 自动识别跳过表头,inferSchema=True自动推导字段类型 df = spark.read.csv("<file>", header=True, inferSchema=True) # 直接进行温度转换 df = df.withColumn("temperature", df[3] * 0.1 * (9.0 / 5.0) + 32.0) # 提取所需字段即可 parsed_result = df.select(df[0].alias("stationID"), df[2].alias("entryType"), "temperature") - 优化字段解析逻辑,清理引号并增加异常捕获避免脏行打断任务:
def parseLine(line): fields = line.split(',') # 统一清理字段首尾的空白字符和双引号 clean = lambda s: s.strip().strip('"') # 先校验字段数量是否符合预期,避免下标越界 if len(fields) < 4: return None stationID = clean(fields[0]) entryType = clean(fields[2]) temp_raw = clean(fields[3]) try: temperature = float(temp_raw) * 0.1 * (9.0 / 5.0) + 32.0 except ValueError: # 转换失败的脏行直接返回空后续过滤 return None return (stationID, entryType, temperature) parsedLines = lines.map(parseLine).filter(lambda x: x is not None)
内容的提问来源于stack exchange,提问作者radhika sharma
相关产品推荐
相关产品推荐

