使用scala在spark中超出绑定异常

时间:2017-10-15 20:43:03

标签: scala apache-spark

我是scala的初学者,我正在做的是将数据集映射到(k, v)kv(0)kv(1)是字符串和kv(2)是一个清单。代码如下:

val rdd_q1_bs = rdd_business.map(lines => lines.split('^')).map(kv =>
  (kv(0), (kv(1), kv(2))))

但问题是,数据集中有kv(2)的空列表。因此,当我使用.collect()收集所有元素时,可能会出现超出界限的异常。 我想的是定义一个函数并检查kv的长度。有没有简单的方法可以忽略异常并保持进程,或者用字符串替换kv(2)

1 个答案:

答案 0 :(得分:0)

lines => lines.split('^')函数表明rdd_business rdd都是RDD[String],并且您正在使用^分割字符串,这将为您提供RDD[Array[String]],并且您可以尝试使用kv(0),kv(1)和kv(2)提取Array的元素。您获得的异常是因为^RDD[String]对象之一中可能只有一个rdd_business

因此,在这种情况下您可以使用TryOption

import scala.util.Try
val rdd_q1_bs = rdd_business.map(lines => lines.split('^')).map(kv =>
  (kv(0), (kv(1), Try(kv(2)) getOrElse("not found"))))

为了更好的安全性,您可以将TryOption应用于数组的所有元素

val rdd_q1_bs = rdd_business.map(lines => lines.split('^')).map(kv =>
  (Try(kv(0)) getOrElse("notFound"), (Try(kv(1)) getOrElse("notFound"), Try(kv(2)) getOrElse("not found"))))

您也可以以同样的方式继续Option

我希望答案很有帮助