dataframe—在读取csv时,spark、scala中的最后一列为空

dauxcl2d  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(703)

当我尝试使用spark和scala读取管道分隔文件时,如下所示:

  1. 1|Consumer Goods|101|
  2. 2|Marketing|102|

我正在使用命令:

  1. val part = spark.read
  2. .format("com.databricks.spark.csv")
  3. .option("delimiter","|")
  4. .load("file_name")

我得到的结果是:

  1. +---+--------------+---+----+
  2. |_c0| _c1|_c2| _c3|
  3. +---+--------------+---+----+
  4. | 1|Consumer Goods|101|null|
  5. | 2| Marketing|102|null|
  6. +---+--------------+---+----+

spark正在读取源文件中不存在的最后一列,因为分隔符被称为管道。有没有其他方法可以让我得到以下结果:

  1. +---+--------------+---+
  2. |_c0| _c1|_c2|
  3. +---+--------------+---+
  4. | 1|Consumer Goods|101|
  5. | 2| Marketing|102|
  6. +---+--------------+---+
1szpjjfi

1szpjjfi1#

您可以使用以下选项

  1. df.drop(df.columns(0)) -- for dropping last column in scala
  2. df.drop(df.columns[-1]) -- for dropping last column in pyspark
kninwzqo

kninwzqo2#

一种解决方案是简单地删除最后一列,如下所示:

  1. part
  2. .select(part.columns.dropRight(1).map(col) : _*)
  3. .show(false)
  4. +---+--------------+---+
  5. |_c0|_c1 |_c2|
  6. +---+--------------+---+
  7. |1 |Consumer Goods|101|
  8. |2 |Marketing |102|
  9. +---+--------------+---+

另一种解决方案是将文件作为文本文件读取,然后像这样自己拆分:

  1. val text = spark.read.text("file_name")
  2. // Note that the split functions in java/scala/spark ignores a separator that ends
  3. // a string, but that one that starts one
  4. val size = text.head.getAs[String]("value").split("\\|").size
  5. text
  6. .withColumn("value", split('value, "\\|"))
  7. .select((0 until size).map(i => 'value getItem i as s"_c$i") : _*)
  8. .show(false)
  9. +---+--------------+---+
  10. |_c0|_c1 |_c2|
  11. +---+--------------+---+
  12. |1 |Consumer Goods|101|
  13. |2 |Marketing |102|
  14. +---+--------------+---+
展开查看全部

相关问题