Scala 带多行选项的多字符分隔符SPARK读取文件

Scala 带多行选项的多字符分隔符SPARK读取文件,scala,apache-spark,Scala,Apache Spark,如何读取spark 3.0.1中带有多行选项的多字符分隔符的文件 输入文件 公司| |街| |市 测试1公司| |第一街| |城市1 测试2公司| |第二街| |城市2 测试3公司| |“第三 街道“| |城市3 spark.read .option(“分隔符”,“| |”) .选项(“标题”、“正确”) .选项(“多行”、“真”) .选项(“推断模式”、“错误”) .csv(转换文件) 在打印数据框时,它将总记录显示为4,而不是3 记录计数:4 +-------------+ |公司| +

如何读取spark 3.0.1中带有多行选项的多字符分隔符的文件

输入文件

公司| |街| |市
测试1公司| |第一街| |城市1
测试2公司| |第二街| |城市2
测试3公司| |“第三
街道“| |城市3
spark.read
.option(“分隔符”,“| |”)
.选项(“标题”、“正确”)
.选项(“多行”、“真”)
.选项(“推断模式”、“错误”)
.csv(转换文件)
在打印数据框时,它将总记录显示为4,而不是3

记录计数:4
+-------------+
|公司|
+-------------+
|Test1公司|
|测试2公司|
|测试3公司|
|“街道”|
+-------------+
+-------------+-----------+-----+
|公司|街|城|
+-------------+-----------+-----+
|测试1公司|第一街|城市1|
|测试2公司|第二街|城市2|
|测试3公司|第三
街道|城市3|
+-------------+-----------+-----+

如果数据帧是单字符分隔符,则与预期的效果相同。

您可以缓存数据帧以确保正确读取:

val df = spark.read.option("delimiter", "||")
        .option("header", "true")
        .option("multiLine", "true")
        .option("inferSchema", "false")
        .csv(transformedFile)

df.cache

df.select("company").show
+-------------+
|      company|
+-------------+
|Test1 company|
|Test2 company|
|Test3 company|
+-------------+

df.count
// 3

谢谢。你能解释一下这里的“缓存”是如何确保文件正确读取的吗?我想spark在缓存时会彻底检查整个文件一次。如果你不缓存,它将使用惰性评估加载文件,这意味着它不会检查整个文件,并且可能会导致非标准文件格式的问题