【问题标题】:Spark rdd split doesn't return last column?Spark rdd split 不返回最后一列?
【发布时间】:2020-03-09 22:47:48
【问题描述】:

我有以下数据:

17|ABC|3|89|89|0|0|2|
17|DFD|3|89|89|0|0|2|
17|RFG|3|89|89|0|0|2|
17|TRF|3|89|89|0|0|2|

当我使用以下代码时,我只得到 8 个元素而不是 9 个,因为最后一个不包含任何值。我不能使用 Dataframes,因为我的 csv 不是固定的,每一行都可以有不同数量的元素。即使是 Null/None,如何获取最后一列的值?

我当前的代码:

data_rdd.filter(x => x contains '|').map{line => line.split('|')}.foreach(elem => {
      println("size of element ->" + elem.size)
      elem.foreach{elem =>
        println(elem)

      }
})

【问题讨论】:

  • my csv is not fixed, it changes every line. 你得到空值的sperator吗?或整列丢失。
  • 没有分隔符,整列丢失但不应该返回空值什么的吗?
  • 明白你的意思。您能否提供有关为什么需要最后一个值为 null 的更多信息?为什么不根据数组的长度跳过?
  • @VinayKV 我不能,因为每一行都有不同的长度。

标签: scala apache-spark split rdd


【解决方案1】:

在 Scala 和 Java 中,split 默认不会返回任何尾随的空字符串。相反,您可以使用稍微不同版本的 split 和第二个参数(重载到 Scala 并在 Java 文档 here 中看到)。

方法定义为:

拆分(字符串正则表达式,整数限制)

这里的第二个参数限制了正则表达式模式的应用次数,使用负数将尽可能多地应用它。

因此,更改代码以使用:

.map{line => line.split("\\|", -1)}

请注意,此split 函数采用正则表达式,而不是普通字符串或字符。

【讨论】:

    【解决方案2】:

    您可以按如下方式拆分字符串:

    scala> "17|ABC|3|89|89|0|0|2|".split("\\|", -1)
    res24: Array[String] = Array(17, ABC, 3, 89, 89, 0, 0, 2, "")
    

    更新代码:

    data_rdd.filter(x => x contains '|').map{line => line.split("\\|", -1)}.foreach(elem => {
          println("size of element ->" + elem.size)
          elem.foreach{elem =>
            println(elem)
    
          }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-03-21
      • 1970-01-01
      • 2021-10-25
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多