在使用Spark和Scala读取CSV文件时,最后一列为空值

3

当我尝试使用 Spark 和 Scala 读取一个以竖线分隔的文件时,代码如下:

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

我正在使用以下命令:

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

我得到的结果是:
+---+--------------+---+----+
|_c0|           _c1|_c2| _c3|
+---+--------------+---+----+
|  1|Consumer Goods|101|null|
|  2|     Marketing|102|null|
+---+--------------+---+----+

由于指定了管道符作为分隔符,Spark正在读取最后一列,而该列在源文件中不存在。是否有替代方法可以获得以下结果:

+---+--------------+---+
|_c0|           _c1|_c2|
+---+--------------+---+
|  1|Consumer Goods|101|
|  2|     Marketing|102|
+---+--------------+---+

Spark正在读取源文件中不存在的最后一列......因为每个列的末尾都有“|”。将其作为textFile读取,并通过管道拆分数据,排除拆分中的最后一个索引值,然后输出元组数据。 - kavetiraviteja
2
创建数据框后,请删除最后一列。 - Lamanus
你解决了你的问题吗? - Oli
2个回答

0
一种解决方案是像这样简单地删除最后一列:

part
  .select(part.columns.dropRight(1).map(col) : _*)
  .show(false)
+---+--------------+---+
|_c0|_c1           |_c2|
+---+--------------+---+
|1  |Consumer Goods|101|
|2  |Marketing     |102|
+---+--------------+---+

另一种解决方案是将文件读取为文本文件,并像这样自己拆分:
val text = spark.read.text("file_name")
// Note that the split functions in java/scala/spark ignores a separator that ends
// a string, but that one that starts one
val size = text.head.getAs[String]("value").split("\\|").size

text
  .withColumn("value", split('value, "\\|"))
  .select((0 until size).map(i => 'value getItem i as s"_c$i") : _*)
  .show(false)
+---+--------------+---+
|_c0|_c1           |_c2|
+---+--------------+---+
|1  |Consumer Goods|101|
|2  |Marketing     |102|
+---+--------------+---+

0

您可以使用以下选项

df.drop(df.columns(0)) -- for dropping last column in scala

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接