我有一个看起来像这样的 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 |
+-----------------+-----------------+-----------------+
在纯文本中,它实际上看起来像这样:
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
我的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)
当multiLine
设置为true
时,df
加载为空。multiLine
设置为时加载正常false
,但我需要multiLine
设置为true
。
如果我将名称更改Column Three
为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
架构和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)
df.show()
结果spark-shell
:
+------------+----------+-----+---------+-----+-----------+--------------------+
|Digital ISBN|Print ISBN|Title|File Name|Price|Description|Book Cover File Name|
+------------+----------+-----+---------+-----+-----------+--------------------+
+------------+----------+-----+---------+-----+-----------+--------------------+
UDPATE 2:
我想我找到了“有什么不同”。当我复制 CSV 中的数据并将其保存到另一个 CSV 时,它工作正常。但是那个原始的CSV(由Excel保存)失败了...... Excel保存的CSV是1290字节,而我自己创建的CSV(工作正常)是1292字节......
更新 3:
我打开了 Update2 中提到的两个文件vim
,注意到 Excel 保存的 CSV 有^M
而不是新行。在此之前我的所有测试都是有缺陷的,因为它总是比较最初由 Excel 保存的 CSV 与从 Sublime 创建的 CSV ...... Sublime 没有显示出差异。我确定我可以安装一个设置或包来查看它,因为我使用 Sublime 作为我的首选一次性文件编辑器......
不知道我是否应该关闭这个问题,因为标题具有误导性。再说一次,对外面的人来说一定有一些价值,哈哈……