Sparklyr使用spark_read_csv读取CSV时如何忽略字段内 换行
Sparklyr读取带多行字段CSV的解决方案
核心问题是spark_read_csv未显式暴露Spark原生CSV读取的multiline参数,但该参数可以通过函数的options入参透传给底层Spark引擎,不需要提前预处理文件,也不需要本地读取后再上传Spark。
可直接运行的代码
替换原有读取逻辑即可:
library(sparklyr) sc <- spark_connect(master = "local", version = "3.1") data <- spark_read_csv( sc = sc, name = "data", path = "test.csv", header = FALSE, options = list( multiline = TRUE, quote = "\"", escape = "\"", encoding = "UTF-8" ) )
参数说明
multiline = TRUE:开启Spark CSV的多行字段识别模式,会自动跳过被引号包裹的字段内部的\n、\r换行符,不会将其识别为行分隔符,从根源解决多余新行的问题。quote = "\"":显式指定字段包裹符号为双引号,匹配测试文件中Payload字段的格式。escape = "\"":指定双引号的转义规则,兼容HTML代码中可能出现的转义双引号,避免字段被意外截断。encoding = "UTF-8":适配网页HTML内容常见的UTF-8编码,减少乱码问题。
验证方式
读取完成后可通过两个简单操作确认读取正确性:
- 运行
sdf_nrow(data)核对总行数,和vroom本地小批量读取的结果比对,确认没有多余行 - 运行
head(data)查看最后一列Payload字段,确认HTML内容完整无截断
补充说明
- 该方案完全在Spark读取链路完成解析,不需要对原始5000万行CSV做任何预处理,也不需要本地全量读取文件后通过
sdf_copy_to上传,避免了内存溢出和分隔符识别错误的问题。 - 如果CSV文件实际使用了其他转义字符(比如反斜杠),只需要对应修改
escape参数的取值即可适配。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

