Databricks平台用Scala写入SQLMI时如何保留CSV多行数据换行格式?
问题描述
- 环境:Databricks + Scala,将含多行文本的CSV数据写入SQL Server托管实例(SQL MI)
- 原始多行数据示例:
This is Multiline data having many lines of text.
- 目标SQL列类型:
Varchar - 问题:写入后换行格式丢失,查询结果变为单行:
This is Multiline data having many lines of text.
- 当前使用的写入代码:
val d = spark.sql("select * from mytable") val bulkCopyConfig = Map( "url" -> myurl, "databaseName" -> mydb, "user" -> myuser, "password" -> mypwd, "dbTable" -> mytable, "batchsize" -> "1000", "tableLock" -> "true", "queryTimeout" -> "5000", "schemaCheckEnabled" -> "false", "truncate" -> "true") d.write.mode("overwrite").options(bulkCopyConfig).format("com.microsoft.sqlserver.jdbc.spark").save()
解决方案
要保留换行格式,需确保换行符在数据流转的每个环节都不被丢失,以下是具体处理步骤:
1. 验证Spark数据中的换行符是否存在
首先确认DataFrame中的文本字段是否还保留着换行符,避免是读取CSV阶段就丢失了:
// 直接查看原始内容(show(false)会完整显示文本) d.select("your_text_column").show(false) // 用正则表达式检测换行符 import org.apache.spark.sql.functions.regexp_extract d.select(regexp_extract(col("your_text_column"), "\\n", 0).alias("has_newline")).distinct().show()
如果读取CSV时就丢失了换行,需要调整读取配置开启多行解析:
val df = spark.read .option("multiLine", "true") // 开启多行模式,让Spark识别跨行的文本 .option("quote", "\"") // 如果CSV中用引号包裹多行文本,必须指定引号符 .csv("path/to/your/csv_file")
2. 调整SQL Server连接器配置
使用com.microsoft.sqlserver.jdbc.spark连接器时,默认批量复制可能会处理换行符,可添加以下配置确保换行符被正确传递:
val bulkCopyConfig = Map( "url" -> myurl, "databaseName" -> mydb, "user" -> myuser, "password" -> mypwd, "dbTable" -> mytable, "bulkCopyBatchSize" -> "1000", // 修正参数名(原配置的batchsize可能不规范) "tableLock" -> "true", "queryTimeout" -> "5000", "schemaCheckEnabled" -> "false", "truncate" -> "true", "characterEncoding" -> "UTF-8" // 指定编码,避免字符转换丢失换行符 ) d.write.mode("overwrite").options(bulkCopyConfig).format("com.microsoft.sqlserver.jdbc.spark").save()
3. 确认SQL Server列的兼容性
Varchar类型本身支持存储换行符(\n或\r\n),但要确保列的长度足够,避免因截断丢失换行符- 如果需要支持Unicode换行符,可将列类型改为
NVarchar,但Varchar已满足基本需求
4. 验证SQL Server中的换行符
写入后,可通过SQL查询确认换行符是否已存储:
SELECT your_text_column, -- 检测换行符(CHAR(10)是\n,CHAR(13)是\r) CHARINDEX(CHAR(10), your_text_column) AS newline_position FROM your_table
如果newline_position返回大于0的值,说明换行符已成功存储。此时如果查询工具(如SSMS)显示为单行,需开启工具的换行显示选项:
- 在SSMS的查询结果窗口右键 → 选项 → 结果 → 勾选「保留CR/LF」
内容的提问来源于stack exchange,提问作者Pysparker
相关产品推荐
相关产品推荐

