加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 当最后一个列名称包含空格时,Spark无法读取CSV

发布时间:2020-12-16 18:47:48 所属栏目:安全 来源:网络整理
导读:我有一个看起来像这样的CSV: +-----------------+-----------------+-----------------+| Column One | Column Two | Column Three |+-----------------+-----------------+-----------------+| This is a value | This is a value | This is a value |+---
我有一个看起来像这样的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

我的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,并且还在架构对象中更新它,那么它可以正常工作.似乎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

架构& spark.read方法:

val df = spark.read
  .format("csv")
  .schema(StructType(Array(
    StructField("Digital ISBN",StringType,true),StructField("Print ISBN",StructField("Title",StructField("File Name",StructField("Price",StructField("Description",StructField("Book Cover File Name",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:

我在vim中打开了Update2中提到的两个文件,发现Excel保存的CSV有^ M而不是新行.我之前的所有测试都是有缺陷的,因为它总是比较最初由Excel保存的CSV与从Sublime创建的CSV … Sublime没有显示差异.我确定我可以安装一个设置或包来查看,因为我使用Sublime作为我的首选一次性文件编辑器…

由于标题具有误导性,我不确定是否应该关闭这个问题.再说一遍,那里的人必须有一些价值大声笑……

解决方法

由于这个问题有一些上升票,这里是解决原始问题的答案……

Windows世界中保存的文件中的换行符包含回车符和换行符. Spark(在Linux上运行)将此视为格式错误的行并将其删除,因为在其世界中,换行符只是换行符.

教训:

>熟悉您正在使用的文件的来源非常重要.>调试数据处理问题时,使用显示回车的编辑器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读