如何用Sparklyr的spark_read_csv正确解析含逗号字段的CSV文件
解决Sparklyr读取含引号包裹逗号的CSV问题
这个问题在CSV解析里太常见了——带引号包裹的字段里藏着分隔符,直接按逗号拆分肯定会把"BANK OF AMERICA, N.A."和"223,000.00"拆成多个字段。好在spark_read_csv底层依赖的Spark CSV数据源原生就支持处理这种场景,只需要设置几个关键参数就能搞定:
核心解决方案:显式指定引号参数
Spark的CSV解析器默认会识别双引号包裹的字段,但有时候显式设置参数能避免环境默认值的异常,直接用下面的代码读取即可:
library(sparklyr) # 先连接到Spark集群(本地模式示例) sc <- spark_connect(master = "local") # 正确读取目标CSV文件 df <- spark_read_csv( sc, name = "your_csv_table", path = "/your/file/path.csv", quote = "\"", # 指定双引号作为字段包裹符 header = FALSE, # 根据你的数据是否有表头调整,示例数据无表头设为FALSE infer_schema = TRUE # 自动推断字段类型,也可以手动指定 )
参数说明
quote = "\"":这个参数告诉解析器,被双引号包裹的内容是单个完整字段,哪怕里面包含分隔符逗号,也不会拆分。Spark默认的quote值就是双引号,但显式声明能避免一些特殊环境下的默认值偏差。escape = "\""(可选):如果你的数据里存在双引号转义的情况(比如字段内的双引号写成""),添加这个参数来处理转义逻辑。header:根据CSV是否有表头行设置为TRUE或FALSE,示例数据无表头所以设为FALSE。
验证解析结果
读取完成后,可以用glimpse()查看数据结构,确认带逗号的字段是否被正确识别为单个字段:
glimpse(df)
进阶:手动指定字段类型
如果自动推断的字段类型不符合预期(比如"223,000.00"被识别为字符串而非数值),可以手动定义schema来强制指定类型:
# 自定义schema,对应你的示例数据字段 custom_schema <- struct_type( struct_field("id", "string"), struct_field("col2", "string"), struct_field("col3", "string"), struct_field("date", "string"), struct_field("col5", "integer"), struct_field("col6", "integer"), struct_field("col7", "integer"), struct_field("col8", "integer"), struct_field("col9", "integer"), struct_field("col10", "double"), struct_field("col11", "double"), struct_field("col12", "integer"), struct_field("bank_name", "string"), struct_field("col14", "double"), struct_field("amount", "double") ) # 使用自定义schema读取 df <- spark_read_csv( sc, name = "your_csv_table", path = "/your/file/path.csv", quote = "\"", header = FALSE, schema = custom_schema )
内容的提问来源于stack exchange,提问作者Yi Du
相关产品推荐
相关产品推荐

