【问题标题】:Spark scala most frequent item in a columnSpark scala 列中出现频率最高的项目
【发布时间】:2018-03-31 01:38:17
【问题描述】:

我有一个包含 4 列的 RDD,如下所示:(列 1 - 名称、2- 标题、3- 视图、4 - 大小)

aa Droomstele 1 8030
aa Wikiquote 1 78261
aa Special 1 20493
aa.b Droomstele 7 4749
aa.b Droomstele 1 4751
af Blowback 2 16896
af Bluff 2 21442
en Bloubok 1 0

我想选择出现频率最高的标题(基于列标题)。 输出应该是: Droomstele
因为它在数据中出现了 3 次。

如何继续对标题进行分组,然后从中获取最大数量?

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:

    这是一种可能性:

    给定这个输入 RDD:

    var input = sc
      .parallelize(Array(
        "aa Droomstele 1 8030",
        "aa Wikiquote 1 78261",
        "aa Special 1 20493",
        "aa.b Droomstele 7 4749",
        "aa.b Droomstele 1 4751",
        "af Blowback 2 16896",
        "af Bluff 2 21442",
        "en Bloubok 1 0"
      ))
      .map(row => row.split(" "))
    

    以下返回Droomstele

    input.map(split => (split(1), 1)) // RDD[("Droomstele", 1), ...]
      .reduceByKey(_ + _)             // RDD[..., ("Droomstele", 3), ...]
      .sortBy(_._2)                   // RDD[("Droomstele", 3), ...] (Droomstele is first)
      .first                          // ("Droomstele", 3)
      ._1                             // "Droomstele"
    

    或者,稍微快一点:

    input.map(split => (split(1), 1))                 // RDD[("Droomstele", 1), ...]
      .reduceByKey(_ + _)                             // RDD[..., ("Droomstele", 3), ...]
      .takeOrdered(1)(Ordering[Int].reverse.on(_._2)) // Array[("Droomstele", 3)]
      .head                                           // ("Droomstele", 3)
      ._1                                             // "Droomstele"
    

    【讨论】:

    • 我检测到了这个托管内存泄漏;大小 = 5281848 字节。由于我的数据文件很大,您能否建议一种更有效的方法。
    • 不知道为什么;这可能会有所帮助:stackoverflow.com/questions/34359211/…
    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    相关资源
    最近更新 更多