0

我正在尝试将下面的 RDD 行分成五列

val test = [hello,one,,,]

val rddTest = test.rdd
val Content = rddTest.map(_.toString().replace("[", "").replace("]", ""))
      .map(_.split(","))
      .map(e ⇒ Row(e(0), e(1), e(2), e(3), e(4), e(5)))

当我执行时,我得到“java.lang.ArrayIndexOutOfBoundsException”,因为最后三个逗号之间没有值。

关于现在如何拆分数据的任何想法?

4

2 回答 2

0

您的代码是正确的,但拆分后您尝试访问 6 个元素而不是 5 个。

改变

.map(e ⇒ Row(e(0), e(1), e(2), e(3), e(4), e(5)))

.map(e ⇒ Row(e(0), e(1), e(2), e(3), e(4)))

更新

默认情况下,我们在进行字符串拆分时会省略空值。这就是为什么您的数组只有 2 个元素的原因。要实现您打算做的事情,请尝试以下操作:

val Content = rddTest.map(_.toString().replace("[", "").replace("]", ""))
      .map(_.split(",",-1))
      .map(e ⇒ Row(e(0), e(1), e(2), e(3), e(4)))

观察 split 函数,以这种方式使用它将确保保留所有字段。

于 2020-07-29T01:31:19.460 回答
0

太脏了,换了好几次。

val test = sc.parallelize(List("[hello,one,,,]"))

test.map(_.replace("[", "").replace("]", "").replaceAll(",", " , "))
    .map(_.split(",").map(_.replace(" ", "")))
    .toDF().show(false)

+------------------+
|value             |
+------------------+
|[hello, one, , , ]|
+------------------+
于 2020-07-29T05:50:30.197 回答