から生成された hadoopFiles オブジェクトを取得しましたsc.newAPIHadoopFile
。
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
ください。どうもありがとう!
PSこの単純化された例を使用してテストできます。
"1=a^2=b^3".split("\\^") map {
field => {
var pair = field.split("=", 2)
if(pair.length == 2)
pair(0) -> pair(1)
else
return
}
} toMap