在 Spark 中读取多行 CSV 文件时,是否可以选择在引号内保留换行符?
Is there any option to preserve line breaks within quotation marks when reading multiline CSV files in Spark?
我有一些 CSV 文件,第三行的引号内有换行符(第一行是 CSV header)。
data/testdata.csv
"id", "description"
"1", "some description"
"2", "other description with line
break"
不管它的 CSV 是否正确,我都必须将它解析成有效的记录。这就是我试过的
public class Main2 {
public static void main(String[] args) {
SparkSession spark = SparkSession.builder()
.master("local[4]")
.getOrCreate();
Dataset<Row> rows = spark
.read()
.format("csv")
.option("header", "true")
.load("data/testdata.csv");
rows
.foreach(row -> System.out.println(row));
}
}
输出如下:
[1, "some description"]
[2, "other description with line]
[break",null]
如您所见,Spark 将 break"
视为一条新记录,并用 null 填充缺失的列。问题是:Spark 的 CSV 解析器是否有允许此类换行符的选项?
我尝试了下面的代码 (reference) 但它不起作用
Dataset<Row> rows = spark.read()
.option("parserLib", "univocity")
.option("multiLine", "true")
.csv("data/testdata.csv");
根据 this article 自 spark 2.2.0 以来,可以解析多行 csv 文件。在我的例子中,这些设置完成了工作:
sparkSession
.read()
.option("sep", ";")
.option("quote", "\"")
.option("multiLine", "true")
.option("ignoreLeadingWhiteSpace", true)
.csv(path.toString());
我有一些 CSV 文件,第三行的引号内有换行符(第一行是 CSV header)。
data/testdata.csv
"id", "description"
"1", "some description"
"2", "other description with line
break"
不管它的 CSV 是否正确,我都必须将它解析成有效的记录。这就是我试过的
public class Main2 {
public static void main(String[] args) {
SparkSession spark = SparkSession.builder()
.master("local[4]")
.getOrCreate();
Dataset<Row> rows = spark
.read()
.format("csv")
.option("header", "true")
.load("data/testdata.csv");
rows
.foreach(row -> System.out.println(row));
}
}
输出如下:
[1, "some description"]
[2, "other description with line]
[break",null]
如您所见,Spark 将 break"
视为一条新记录,并用 null 填充缺失的列。问题是:Spark 的 CSV 解析器是否有允许此类换行符的选项?
我尝试了下面的代码 (reference) 但它不起作用
Dataset<Row> rows = spark.read()
.option("parserLib", "univocity")
.option("multiLine", "true")
.csv("data/testdata.csv");
根据 this article 自 spark 2.2.0 以来,可以解析多行 csv 文件。在我的例子中,这些设置完成了工作:
sparkSession
.read()
.option("sep", ";")
.option("quote", "\"")
.option("multiLine", "true")
.option("ignoreLeadingWhiteSpace", true)
.csv(path.toString());