【发布时间】:2015-02-04 01:02:45
【问题描述】:
我有一个从sc.newAPIHadoopFile 生成的 hadoopFiles 对象。
scala> hadoopFiles
res1: org.apache.spark.rdd.RDD[(org.apache.hadoop.io.LongWritable, org.apache.hadoop.io.Text)] = UnionRDD[64] at union at <console>:24
我打算遍历hadoopFiles中的所有行并对其进行操作和过滤,其中应用if检查并将引发异常:
scala> val rowRDD = hadoopFiles.map(line =>
| line._2.toString.split("\\^") map {
| field => {
| var pair = field.split("=", 2)
| if(pair.length == 2)
| (pair(0) -> pair(1))
| }
| } toMap
| ).map(kvs => Row(kvs("uuid"), kvs("ip"), kvs("plt").trim))
<console>:33: error: Cannot prove that Any <:< (T, U).
} toMap
^
但是,如果我删除 if(pair.length == 2) 部分,它会正常工作:
scala> val rowRDD = hadoopFiles.map(line =>
| line._2.toString.split("\\^") map {
| field => {
| var pair = field.split("=", 2)
| (pair(0) -> pair(1))
| }
| } toMap
| ).map(kvs => Row(kvs("uuid"), kvs("ip"), kvs("plt").trim))
warning: there was one feature warning; re-run with -feature for details
rowRDD: org.apache.spark.rdd.RDD[org.apache.spark.sql.catalyst.expressions.Row] = MappedRDD[66] at map at <console>:33
谁能告诉我这种现象的原因,并告诉我应用if语句的正确方法。非常感谢!
P.S.我们可以用这个简化的例子来测试:
"1=a^2=b^3".split("\\^") map {
field => {
var pair = field.split("=", 2)
if(pair.length == 2)
pair(0) -> pair(1)
else
return
}
} toMap
【问题讨论】:
-
如果
pair.length != 2.你也为这种情况提供了一些东西。 -
把它过滤掉。我只寻找完全由两部分组成的键值对。 @SarveshKumarSingh
标签: scala collections apache-spark flatmap