spark:用特殊情况读取dat文件

kpbpu008  于 2021-05-27  发布在  Spark
关注(0)|答案(3)|浏览(685)

我有一个.dat文件,由 \u0001 . 应该是这样的

+---+---+---+
|A  |B  |C  |
+---+---+---+
|1  |2,3|4  |
+---+---+---+
|5  |6  |7  |
+---+---+---+

但是我得到的文件在几行的字段之间有很多空格

A\u0001B\u0001C
1\u0001"2,3"                                                                               \u00014
5\u00016\u00017

在上面的第二行中,两列之间有79个空格。现在当我在spark里读到这个文件时

val df = spark.read.format("csv").option("header", "true").option("delimiter", "\u0001").load("path")

df.show(false)

+---+-----------------------------------------------------------------------------------+----+
|A  |B                                                                                  |C   |
+---+-----------------------------------------------------------------------------------+----+
|1  |2,3                                                                               4|null|
+---+-----------------------------------------------------------------------------------+----+
|5  |6                                                                                  |7   |
+---+-----------------------------------------------------------------------------------+----+

有没有办法在不改变输入文件的情况下解决这个问题?

fdbelqdn

fdbelqdn1#

您需要删除引号字符属性并将尾部属性设置为

val df = spark.read.format("csv")
         .option("header", true)
         .option("delimiter", "\u0001")
         .option("quote", '')
         .option("ignoreLeadingWhiteSpace", true)
         .option("ignoreTrailingWhiteSpace", true)
         .load("path")
iyfjxgzm

iyfjxgzm2#

为此,通过将“ignoreleadingwhitespace”和“ignoretrailingwhitespace”设置为true,您将删除所有空格:

val df = spark.read.format("csv")
         .option("header", true)
         .option("delimiter", "\u0001")
         .option("ignoreLeadingWhiteSpace", true)
         .option("ignoreTrailingWhiteSpace", true)
         .load("path")

df.show(10, false)
s3fp2yjn

s3fp2yjn3#

尝试添加 .option("ignoreTrailingWhiteSpace", true) 根据文件:
ignoretrailingwhitespace(默认为false):一个标志,指示是否应跳过正在读取的值的尾部空白。
编辑:您需要关闭报价以使其适用于您的示例:

val df2 = spark.read.format("csv")
  .option("header", true)
  .option("quote", "")
  .option("delimiter", "\u0001")
  .option("ignoreTrailingWhiteSpace", true)
  .load("data2.txt")

结果:

df2.show()
+---+-----+---+
|  A|    B|  C|
+---+-----+---+
|  1|"2,3"|  4|
|  5|    6|  7|
+---+-----+---+

要删除引号,可以尝试(注意这将删除字符串中的引号):

import org.apache.spark.sql.functions.regexp_replace

df2.withColumn("B", regexp_replace(df2("B"), "\"", "")).show()
+---+---+---+
|  A|  B|  C|
+---+---+---+
|  1|2,3|  4|
|  5|  6|  7|
+---+---+---+

相关问题