scala - 在读取 CSV 时,最后一列在 Spark、Scala 中显示为 Null

标签 scala dataframe csv apache-spark pyspark

当我尝试使用 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|
+---+--------------+---+

最佳答案

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

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

关于scala - 在读取 CSV 时,最后一列在 Spark、Scala 中显示为 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63869125/

相关文章:

scala - ScalaTest 可以在没有同步调用的情况下检测超时吗(比如在无限循环中?)

scala - 无法用作模式中的提取器,因为它缺少 unapply 或 unapplySeq 方法

scala - 在持久化 RDD 上有多个操作的情况下,缓存 RDD 的工作原理

dataframe - 如何按列值在pyspark df中添加更多行

r - 从 xml 中提取信息

r - 如何将未知的分隔符 csv 文件读入 R

scala - 聚集泛化和折叠泛化如何减少?

python - 用整数列表/元组替换 Pandas DataFrame 列中的值

r - 有没有办法阻止表格在 R 中排序

java - 配置 CsvMapper 以检查写入的每个值