Scala 为什么在Spark 1.1.0中拆分字符串会产生BoundsException数组(在1.4.0中效果很好)?

Scala 为什么在Spark 1.1.0中拆分字符串会产生BoundsException数组(在1.4.0中效果很好)?,scala,apache-spark,Scala,Apache Spark,我使用的是Spark 1.1.0和Scala 2.10.4 我的意见如下: 100,aviral,Delhi,200,desh 200,ashu,hyd,300,desh 执行时: sc.textFile(inputFile).keyBy(line => line.split(',')(2)) Spark为我提供了BoundsException阵列。为什么? 请注意,同样的代码在Spark 1.4.0中也可以正常工作。有人能解释不同行为的原因吗?在Spark 1.4.1/Spark s

我使用的是Spark 1.1.0和Scala 2.10.4

我的意见如下:

100,aviral,Delhi,200,desh
200,ashu,hyd,300,desh
执行时:

sc.textFile(inputFile).keyBy(line => line.split(',')(2))
Spark为我提供了
BoundsException阵列。为什么?

请注意,同样的代码在Spark 1.4.0中也可以正常工作。有人能解释不同行为的原因吗?

在Spark 1.4.1/Spark shell中,它可以正常工作 使用一些数据定义rdd

val rdd = sc.parallelize(Array("1,abc,2,xyz,3","4,qwerty,5,abc,4","9,fee,11,fie,13"))
rdd: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[0] at parallelize at <console>:21
请注意,它在拆分后从第三个元素生成键,但打印看起来很奇怪。起初,它看起来不是正确的元组,但这是一个打印工件,因为它缺少字符串上的任何引号。我们可以对其进行测试,以提取值,并查看是否返回该行:

 rdd.keyBy(line => line.split(',')(2) ).values.collect()
 res12: Array[String] = Array(1,abc,2,xyz,3, 4,qwerty,5,abc,4, 9,fee,11,fie,13)
这看起来和预期的一样。请注意,数组中只有3个元素,此处的逗号位于元素字符串中

我们还可以使用
.map()
进行配对,如下所示:

rdd.map( line => (line.split(',')(2), line.split(',')) ).collect()
res7: Array[(String, Array[String])] = Array((2,Array(1, abc, 2, xyz, 3)), (5,Array(4, qwerty, 5, abc, 4)), (11,Array(9, fee, 11, fie, 13)))
它被打印成元组

或者为了避免重复工作,可能:

def splitter(s:String):(String,Array[String]) = {
    val parsed = s.split(',')
    (parsed(2), parsed)
}

rdd.map(splitter).collect()
res8: Array[(String, Array[String])] = Array((2,Array(1, abc, 2, xyz, 3)), (5,Array(4, qwerty, 5, abc, 4)), (11,Array(9, fee, 11, fie, 13))

这更容易阅读。它的解析也稍微多一些,因为这里我们将行拆分为单独的值。

问题是第一行之后有一个空行-拆分它不会返回包含必要列数的数组

 1,abc,2,xyz,3
<empty line - here lies the problem>   
 4,qwerty,5,abc,4

这不应该被否决。这些都是解释错误的有效问题。可能您建议的代码中有语法错误。您可能需要重新排列或添加括号以防止早期评估,或者这很好,我还没有检查。是的,为了答案的质量,我希望向下投票人解释我的推理不正确的原因。我会在有时间的时候再次检查这段代码。你能检查一下所有的行是否都有适当数量的元素,比如说3个对应于Q中的
(2)
?用
filterNot
快速扫描可以给你一个答案。根据我在问题中指定的输入文件。。。我看不出有数据问题。
 1,abc,2,xyz,3
<empty line - here lies the problem>   
 4,qwerty,5,abc,4
sc.textFile(inputFile)
.map.(_.split(","))
.filter(_.size == EXPECTED_COLS_NUMBER)
.keyBy(line => line(2))