Sam*_*yek 7 csv scala apache-commons apache-spark spark-csv
我有一个看起来像这样的CSV:
+-----------------+-----------------+-----------------+
| Column One | Column Two | Column Three |
+-----------------+-----------------+-----------------+
| This is a value | This is a value | This is a value |
+-----------------+-----------------+-----------------+
| This is a value | This is a value | This is a value |
+-----------------+-----------------+-----------------+
| This is a value | This is a value | This is a value |
+-----------------+-----------------+-----------------+
Run Code Online (Sandbox Code Playgroud)
在纯文本中,它实际上看起来像这样:
Column One,Column Two,Column Three
This is a value,This is a value,This is a value
This is a value,This is a value,This is a value
This is a value,This is a value,This is a value
Run Code Online (Sandbox Code Playgroud)
我的spark.read方法看起来像这样:
val df = spark.read
.format("csv")
.schema(schema)
.option("quote", "\"")
.option("escape", "\"")
.option("header", "true")
.option("multiLine", "true")
.option("mode", "DROPMALFORMED")
.load(inputFilePath)
Run Code Online (Sandbox Code Playgroud)
当multiLine被设定为true,在df负载为空.它multiLine设置为时加载正常false,但我需要multiLine设置为true.
如果我更改Column Threeto 的名称ColumnThree,并在schema对象中更新它,那么它工作正常.好像multiLine正在应用于标题行!我希望在header设置时也不会出现这种情况true.
任何想法如何解决这个问题?我应该使用univocity解析器而不是默认值commons吗?
更新:
我不知道为什么这些模拟数据工作正常.这是一个更接近的数据表示:
CSV(只有1个标题和1行数据......):
Digital ISBN,Print ISBN,Title,Price,File Name,Description,Book Cover File Name
97803453308,test,This is English,29.99,qwe_1.txt,test,test
Run Code Online (Sandbox Code Playgroud)
架构和spark.read方法:
val df = spark.read
.format("csv")
.schema(StructType(Array(
StructField("Digital ISBN", StringType, true),
StructField("Print ISBN", StringType, true),
StructField("Title", StringType, true),
StructField("File Name", StringType, true),
StructField("Price", StringType, true),
StructField("Description", StringType, true),
StructField("Book Cover File Name", StringType, true)
)))
.option("quote", "\"")
.option("escape", "\"")
.option("header", "true")
.option("multiLine", "true")
.option("mode", "DROPMALFORMED")
.load(inputFilePath)
Run Code Online (Sandbox Code Playgroud)
df.show()结果是spark-shell:
+------------+----------+-----+---------+-----+-----------+--------------------+
|Digital ISBN|Print ISBN|Title|File Name|Price|Description|Book Cover File Name|
+------------+----------+-----+---------+-----+-----------+--------------------+
+------------+----------+-----+---------+-----+-----------+--------------------+
Run Code Online (Sandbox Code Playgroud)
UDPATE 2:
我想我找到了"有什么不同".当我复制CSV中的数据并将其保存到另一个CSV时,它可以正常工作.但原始CSV(由Excel保存)失败... Excel保存的CSV为1290字节,而我自己创建的CSV(工作正常)为1292字节....
更新3:
我打开了Update2中提到的两个文件vim,发现Excel保存的CSV ^M代替了新行.我之前的所有测试都是有缺陷的,因为它总是比较最初由Excel保存的CSV与从Sublime创建的CSV ... Sublime没有显示差异.我确定我可以安装一个设置或包来查看,因为我使用Sublime作为我的首选一次性文件编辑器...
由于标题具有误导性,我不确定是否应该关闭这个问题.再说一遍,那里的人必须有一些价值大声笑......
由于该问题有一些赞成票,因此以下是原始问题的解决方案作为答案......
Windows 世界中保存的文件中的换行符同时包含carriage return和line feed。Spark(在 Linux 上运行)将此视为格式错误的行并将其丢弃,因为在它的世界中,换行符只是line feed.
教训: