代码之家  ›  专栏  ›  技术社区  ›  Sam Malayek

当最后一个列名包含空格时,spark无法读取csv

  •  6
  • Sam Malayek  · 技术社区  · 6 年前

    我有一个这样的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 , the df 装载为空。当 多行 设置为 false 但是我需要 多行 设置为 .

    如果我更改 Column Three ColumnThree ,并在 schema 对象,然后它工作正常。看起来像 多行 正在应用于标题行!我希望不会是这样 header 也设置为 .

    有什么解决办法吗?我应该使用 univocity 解析器而不是默认值 commons ?

    更新:

    我不知道为什么模拟数据工作得很好。以下是数据的更详细表示:

    csv(只有一个标题和一行数据…):

    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|
    +------------+----------+-----+---------+-----+-----------+--------------------+
    +------------+----------+-----+---------+-----+-----------+--------------------+
    

    乳房2:

    我想我发现了“有什么不同”。当我复制csv中的数据并将其保存到另一个csv时,它工作正常。但是原始的csv(由excel保存)失败了…Excel保存的csv是1290字节,而我自己创建的csv(工作正常)是1292字节….

    更新3:

    我在中打开了update2中提到的两个文件 vim 注意到Excel保存的csv ^M 而不是新行。在此之前,我所有的测试都存在缺陷,因为它总是将Excel最初保存的csv与由Sublime创建的csv进行比较…崇高并没有表现出不同。我确信我可以安装一个设置或包来查看,因为我使用Sublime作为一次性文件编辑器…

    不确定是否应该结束这个问题,因为标题有误导性。再说一次,外面的人一定有价值,哈哈…

    2 回复  |  直到 6 年前
        1
  •  1
  •   Sam Malayek    6 年前

    既然这个问题有几张赞成票,下面是原始问题的解决方案作为答案…

    保存在Windows世界中的文件中的换行符包含 carriage return line feed . spark(在linux上运行)将其视为一个畸形的行,并将其丢弃,因为在其世界中,换行符只是 线路馈送 .

    课程:

    • 熟悉正在使用的文件的来源是很重要的。
    • 调试数据处理问题时,请使用显示回车的编辑器。
        2
  •  0
  •   Jared    6 年前

    我也面临同样的问题,多行选项应用于标题。我通过添加忽略尾随空格的附加选项来解决这个问题。

      .option("header", true)
      .option("multiLine", true)
      .option("ignoreTrailingWhiteSpace", true)