Spark查询DataFrame时ProposedAction与SimpleMatchRate列值错位原因
问题根因
两列值错位互换由Spark CSV读取默认规则与预期不一致导致:
读取CSV/TSV文件时,若同时配置header="true"和自定义StructType schema,Spark默认开启enforceSchema=true规则:该模式下仅会跳过文件第一行表头内容,不会根据表头文本与schema字段名做匹配,而是严格按照schema定义的字段顺序,与文件内列的物理位置从左到右一一对应赋值。
当前自定义schema的字段顺序为:
- Matched
- MatchRate
- ProposedAction
- SimpleMatchRate
- Status
但实际读取的源TSV文件中,第三列存储的是数值类SimpleMatchRate内容,第四列存储的是is_new/is_linked/is_dupe这类ProposedAction枚举值,两列物理顺序与schema定义顺序刚好颠倒,因此出现值完全错位的现象。
另外代码片段存在一处隐藏错误:使用glob.glob遍历文件但未提前导入glob模块,直接运行会触发NameError,需补充对应导入语句。
修复方案
两种方案任选其一即可:
- 方案1:调整自定义schema的字段顺序,互换
ProposedAction和SimpleMatchRate的定义位置,与源文件列物理顺序保持一致。 - 方案2:读取文件时新增
enforceSchema=False参数,此时Spark会自动根据源文件表头名与传入的schema字段名做匹配,无需严格对齐schema顺序与文件列顺序,同时会自动校验字段类型。修改后的读取代码如下:
# 补充缺失的glob导入 import glob df = spark.read.csv( files, sep="\t", header="true", encoding="UTF-8", schema=customschema, enforceSchema=False )
内容的提问来源于stack exchange,提问作者Banty
相关产品推荐
相关产品推荐

