【问题标题】:Scala - Not enough arguments for method countScala - 方法计数的参数不足
【发布时间】:2020-07-01 00:40:10
【问题描述】:

我对 Scala 和 Spark RDD 编程相当陌生。我正在使用的数据集是一个 CSV 文件,其中包含电影列表(每部电影一行)及其相关的用户评分(以逗号分隔的评分列表)。 CSV 中的每一列代表一个不同的用户以及他/她对电影的评分。因此,用户 1 对每部电影的评分显示在左起第 2 列中:

示例输入:

蜘蛛侠,1,2,,3,3

Dr.Sleep, 4,4,,,1

我收到以下错误:

Task4.scala:18: error: not enough arguments for method count: (p: ((Int, Int)) => Boolean)Int.
Unspecified value parameter p.
    var moviePairCounts = movieRatings.reduce((movieRating1, movieRating2) => (movieRating1, movieRating2, movieRating1._2.intersect(movieRating2._2).count()

当我执行下面的几行时。对于下面的程序,第二行代码将所有由“,”分隔的值拆分并生成:

( 蜘蛛侠, [[1,0],[2,1],[-1,2],[3,3],[3,4]] ) ( Dr.Sleep, [[4,0],[4,1],[-1,2],[-1,3],[1,4]] )

在第三行,使用 count() 会引发错误。对于每部电影(行),我试图获得共同元素的数量。在上面的例子中,[-1, 2] 显然是蜘蛛侠和 Dr.Sleep 共享的一个共同元素。

    val textFile = sc.textFile(args(0))
    
    var movieRatings = textFile.map(line => line.split(","))
                                .map(movingRatingList => (movingRatingList(0), movingRatingList.drop(1)
                                .map(ranking => if (ranking.isEmpty) -1 else ranking.toInt).zipWithIndex));
                                

    
    var moviePairCounts = movieRatings.reduce((movieRating1, movieRating2) => (movieRating1, movieRating2, movieRating1._2.intersect(movieRating2._2).count() )).saveAsTextFile(args(1));

我的第3行的目标输出如下:

( Spiderman, Dr.Sleep, 1 ) --> 在这 2 部电影之间,有 1 个共同条目。

有人可以建议吗?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    要获取集合中元素的数量,请使用lengthsizecount() 返回满足某些附加条件的元素的数量。

    或者您可以通过使用count 计算第二个集合的第一个集合的元素来避免构建完整的交集:

    movieRating1._2.count(movieRating2._2.contains(_))
    

    【讨论】:

    • 好吧,我想我把 [Scala 函数] 误认为是 Spark RDD 动作,数。我打算使用 RDD 操作,Count。我经常将 Scala 函数误认为 Spark RDD Actions。我怎么能很容易地知道将应用哪一个(即,这是知道这一点以将变量的值显式打印到控制台的唯一方法,如果它是 Spark.RDD 类型,那么我知道将调用 RDD Action ,但如果它是非 RDD 类型,那么我可以假设它是应用的 Scala 方法?
    • 另外,如果我想加快我的程序,我应该尽可能多地使用 RDD 转换/动作,而不是使用常规的 Scala 方法,对吧?因为RDD Transforms/Actions导致数据以分布式方式处理,而使用Scala方法导致数据在单机+单线程上运行,我的理解是否正确?
    • 1. RDD 转换和动作 Scala 方法。它们只是不是 Scala 收集方法。 2.我建议不要打印值,而是放置类型注释,例如val movieRatings: RDD[...]。在 IDE 中,只需将鼠标悬停在变量上即可显示类型。 3. “而使用 Scala 方法会导致数据在单台机器 + 单线程上运行”如果您在传递给 RDD 方法的 lambda 中使用它们,则不会......
    【解决方案2】:

    错误消息似乎很清楚:count 接受一个参数,但在您的调用中,您传递的是一个空参数列表,即零个参数。您需要将一个参数传递给count

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 2011-10-19
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多