当rdd行之间没有值时,如何用逗号分割它们?

mdfafbf1  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(519)

我正在尝试将下面的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”,因为在最后三个逗号之间没有值。
现在有没有关于如何分割数据的想法?

r55awzrz

r55awzrz1#

太脏了,但换了好几次。

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

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

+------------------+
|value             |
+------------------+
|[hello, one, , , ]|
+------------------+
yptwkmov

yptwkmov2#

您的代码是正确的,但是在拆分之后,您尝试访问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函数,以这种方式使用它将确保保留所有字段。

相关问题