【问题标题】:How to split RDD rows by commas when there is no value between them?当RDD行之间没有值时如何用逗号分割它们?
【发布时间】:2020-07-28 21:21:20
【问题描述】:

我正在尝试将下面的 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”,因为最后三个逗号之间没有值。

关于如何拆分数据现在有什么想法吗?

【问题讨论】:

  • 检查你的索引,有 5 个元素。
  • 嗨,对不起。在我的主要代码中,我只拥有它直到 e(4)。我在 e(2) 处得到 indexoutofbounds,因为在 conmas 2 和 3 之间没有任何值。有什么解决办法吗?

标签: scala apache-spark spark2


【解决方案1】:

太脏了,换了好几次。

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

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

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

【讨论】:

    【解决方案2】:

    您的代码是正确的,但拆分后您尝试访问 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 函数,这样使用它可以确保所有字段都被保留。

    【讨论】:

    • 嗨,对不起。在我的主要代码中,我只拥有它直到 e(4)。我在 e(2) 处得到 indexoutofbounds,因为在 conmas 2 和 3 之间没有任何值。有什么解决办法吗?
    • 我不明白你是如何初始化 rdd ==> test.rdd 不起作用
    • 我已经更新了答案。这应该适合你
    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 2021-08-23
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-03-18
    • 2019-02-23
    相关资源
    最近更新 更多