开发者社区> 问答> 正文

spark scala用map和过滤器阅读文本文件

我有一个文本文件,格式如下(id,f1,f2,f3,...,fn):

12345,0,0,1,2,...,3
23456,0,0,1,2,...,0
33333,0,1,1,0,...,0
56789,1,0,0,0,...,4
a_123,0,0,0,6,...,3
我想要读取文件(忽略线条a_123,0,0,0,6,...,3)来创建一个RDD[(Long, Vector)。这是我的解决方案:

def readDataset(path: String, sparkSession: SparkSession): RDD[(ItemId, Vector)] = {

val sc = sparkSession.sparkContext
sc.textFile(path)
  .map({ line => val values=line.split(",")
    (
      values(0).toLong,
      //util.Try(values(0).toLong).getOrElse(0L),
      Vectors.dense(values.slice(1, values.length).map {x => x.toDouble }).toSparse
    )})
  .filter(x => x._1 > 0)

}
但是这段代码无法编译:

[ERROR] found : org.apache.spark.rdd.RDD[(Long, org.apache.spark.ml.linalg.SparseVector)]
[ERROR] required: org.apache.spark.rdd.RDD[(Long, org.apache.spark.ml.linalg.Vector)]
[ERROR] (which expands to) org.apache.spark.rdd.RDD[(Long, org.apache.spark.ml.linalg.Vector)]
[ERROR] Note: (Long, org.apache.spark.ml.linalg.SparseVector) <: (Long, org.apache.spark.ml.linalg.Vector), but class RDD is invariant in type T.
[ERROR] You may wish to define T as +T instead. (SLS 4.5)
[ERROR] .filter(x => x._1 > 0)
[ERROR] ^
[ERROR] one error found
但是,如果我删除. toSparse或.filter(x => x._1 > 0)此代码可以成功编译。

有人知道为什么以及我该怎么做才能解决它?

还有没有更好的方法来读取文件到RDD忽略非数字id行?

展开
收起
社区小助手 2018-12-19 17:10:42 3365 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    如果删除代码编译成功toSparse,因为类型PairRDD是(ItemId, Vector)。

    在org.apache.spark.ml.linalg.Vector类/类型来表示您正在使用生成密集向量Vector.dense,当你调用toSparse它被转换成org.apache.spark.ml.linalg.SparseVector这是不是你的PairRDD期望的类型。

    至于过滤非整数ID我会说你的方法是一个很好的方法。

    2019-07-17 23:23:05
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spark Streaming At Bing Scale 立即下载
Apache Spark: Cloud and On-Prem 立即下载
JDK8新特性与生产-for“华东地区scala爱好者聚会” 立即下载