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

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

我正在尝试将下面的rdd行拆分为五列

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

当我执行时,我得到“java.lang.arrayindexoutofboundsexception”,因为在最后三个逗号之间没有值。
现在有没有关于如何分割数据的想法?

r55awzrz

r55awzrz1#

太脏了,但换了好几次。

  1. val test = sc.parallelize(List("[hello,one,,,]"))
  2. test.map(_.replace("[", "").replace("]", "").replaceAll(",", " , "))
  3. .map(_.split(",").map(_.replace(" ", "")))
  4. .toDF().show(false)
  5. +------------------+
  6. |value |
  7. +------------------+
  8. |[hello, one, , , ]|
  9. +------------------+
yptwkmov

yptwkmov2#

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

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

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

更新
默认情况下,执行字符串拆分时会忽略空值。这就是为什么你的数组只有2个元素。要实现您的目标,请尝试以下方法:

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

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

展开查看全部

相关问题