我是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)
?
答案 0 :(得分:0)
lines => lines.split('^')
函数表明rdd_business
rdd都是RDD[String]
,并且您正在使用^
分割字符串,这将为您提供RDD[Array[String]]
,并且您可以尝试使用kv(0),kv(1)和kv(2)提取Array的元素。您获得的异常是因为^
(RDD[String]
对象之一中可能只有一个rdd_business
。
因此,在这种情况下您可以使用Try
或Option
。
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"))))
为了更好的安全性,您可以将Try
或Option
应用于数组的所有元素
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
。
我希望答案很有帮助