Spark rdd拆分不返回最后一列吗?

时间:2019-11-14 03:31:12

标签: scala apache-spark split rdd

我有以下数据:

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个元素,因为最后一个不包含任何值。我无法使用Dataframe,因为我的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)

      }
})

2 个答案:

答案 0 :(得分:1)

在Scala和Java中,public class ModulePresenter : SignalR, IModulePresenter { private ModuleService _service; public ModulePresenter() { _service = new ModuleService(); MyHub.CommandSent += MyHub_CommandSent; } private void MyHub_CommandSent(object sender, CommandSentEventArgs e) { switch (e.Command) { case Enumerables.Command.RequestToken: { string finalDataJson = _service.ProcessData(e.Parameters); SignalR.OnCommandCompleted(new CommandCompletedEventArgs(e.ClientDetails.ConnectionId, finalData)); } break; default: break; } } } 在默认情况下都不会返回任何结尾的空字符串。相反,您可以使用稍有不同的split版本和第二个参数(已重载到Scala并在Java文档here中可见)。

方法定义为:

  

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

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

因此,更改代码以使用:

split

请注意,此.map{line => line.split("\\|", -1)} 函数使用正则表达式而不是常规字符串或char。

答案 1 :(得分:0)

您可以如下分割字符串:

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)

      }
}