标签生成器

news/2024/7/24 8:05:58 标签: 大数据, json, python

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

package com.hhb.spark.core

import org.apache.spark.{SparkConf, SparkContext}

import com.alibaba.fastjson.JSON

/**
  * 标签生成器
  * Created by dell on 2017/9/20.
  */
object TagGenerator {
  def main(args: Array[String]) {
    val conf = new SparkConf()
      .setAppName("TagGenerator").setMaster("local")
      .set("spark.testing.memory", "2147480000")
    val sc = new SparkContext(conf)

    // 加载文件
    val rdd1 = sc.textFile("c://temptags.txt")
    // 过滤文件
    val rdd2 = rdd1.map(line => {
      val arr = line.split("\\t")// 切割
      val busId = arr(0)
      val text = arr(1)
      // 将字符串转为json对象
      val jo = JSON.parseObject(text)
      val jarr = jo.getJSONArray("extInfoList")
      if(jarr != null && jarr.size() > 0){
        val v1 = jarr.getJSONObject(0)
        val arr2 = v1.getJSONArray("values")

        if (arr2 != null && arr2.size() > 0){
          var str = ""
          var i = 0
          while (i < arr2.size()) {
            str = str + arr2.getString(i) + ","
            i += 1
          }
          (busId, str.substring(0, str.length - 1))
        }
        else (busId, "")
      }
      else (busId, "")
    })

    // 过滤,没有评论的过滤掉
    val rdd3 = rdd2.filter(t => {
      t._2 != null && !"".equals(t._2)
    })

    // 按照value压扁
    val rdd4 = rdd3.flatMapValues(_.split(","))

    // 重组key busId-comm, 1
    val rdd5 = rdd4.map(t=>{
      (t._1 + "-" + t._2, 1)
    })

    // 聚合
    val rdd6 = rdd5.reduceByKey(_ + _)

    // 变换成(busId, (comm, count))
    val rdd7 = rdd6.map(t => {
      val arr = t._1.split("-")
      (arr(0), (arr(1), t._2) :: Nil)
    })

    // 安装busId进行聚合,values是list
    val rdd8 = rdd7.reduceByKey(_ ++ _)

    // 按key降序排序
    val rdd9 = rdd8.map(t => {
      val x = t._2.sortBy(t=>{
        t._2
      }).reverse.take(5)
      (t._1, x)
    })

    val rdd99 = rdd9.sortBy(t => {
      t._2(0)._2
    },false,1)

    // 变换成(busId, )
    val rdd10 = rdd99.map(t =>{
      val col = t._2
      var desc = "";
      for (tt <- col){
        desc = desc + tt._1 + "(" + tt._2 + "),"
      }
      (t._1,desc.substring(0, desc.length-1))
    })

    rdd10.foreach(println)

    sc.stop()
  }
}

转载于:https://my.oschina.net/hehongbo/blog/1540680


http://www.niftyadmin.cn/n/1843089.html

相关文章

通吃trie树

说明&#xff1a;本文转自 http://blog.csdn.net/jxh_123/article/details/28641015 很有段时间没写此系列了&#xff0c;今天我们来说Trie树&#xff0c;Trie树的名字有很多&#xff0c;比如字典树&#xff0c;前缀树等等。 一&#xff1a;概念 下面我们有and,as,at,cn,com这些…

Trie字典树算法

说明&#xff1a;本文转自 http://powman.org/archives/trie.html 前一段时间写了个微型输入法&#xff0c;使用map进行查找&#xff0c;发现效率不高。正好最近也在针对一个查找功能做优化&#xff0c;针对我的应用场景使用了Trie字典树。 特性 Trie树属于树形结构&#xff0c…

Linux 下tomcat+jdk+mysql安装

JDK 1、用xftp把 jdk1.8.0_65上传到local下 给他赋予最高权限 1&#xff09;切换到顶级目录 cd ~ 2&#xff09;然后切换到上级目录 cd .. 3)切换到local路径下 cd /usr/local 4)赋予JDK文件最高权限 chmod 777 -R jdk1.8.0_65 配置环境变量 1&#xff09;切换到顶级目…

使用Docker和Golang进行便捷的MongoDB测试

本文讲的是使用Docker和Golang进行便捷的MongoDB测试&#xff0c;【编者的话】Docker的使用场景之一就是测试&#xff0c;在测试中&#xff0c;我们有时候会由于超时或者仅仅因为两个开发版本使用相同的数据库在同时运行而导致测试出错。本文以Golang和MongoDB为例&#xff0c;…

很特别的一个动态规划入门教程

说明&#xff1a;本文转自 http://blog.csdn.net/woshioosm/article/details/7438834很特别的一个动态规划入门教程今天在网上看到一个讲动态规划的文章&#xff0c;是以01背包为例的&#xff0c;这文章和书上的讲解非常不一样&#xff0c;令我眼前一亮&#xff0c;于是转载一下…

循环的其他用法

假设我们要打印1~20之间的数字,但是5的倍数不打印.1 2 3 4 6 7 8 9 11 12 13 14 16 17 18 19打印26个字母A-Z打印九九乘法口诀表.break和continue以及循环的关系弄明白把刚刚那个九九乘法口诀表弄明白.while循环do while 循环 break continue这么多语法. 都可以实现同样的功能.…

关于STL的历史(一) -- 引自Morning主页

说明&#xff1a;本文转自 http://blog.csdn.net/beick/article/details/125309 最近一直在研究GP与STL,拜读了一本这方面的经典著作《GP & STL》,觉得Austern和侯捷老师的功夫真是不一般啊&#xff01;记录下STL的历史&#xff0c;予以自缅&#xff1a; 被誉为STL之父…

STL版本简介

说明&#xff1a;本文仅供学习交流&#xff0c;转载请标明出处&#xff0c;欢迎转载&#xff01; 本文的参考文献为&#xff1a;《STL源码剖析》侯捷 &#xff08;1&#xff09;HP STL&#xff1a;所有STL的祖先版本&#xff0c;由C之父Alexander Stepanov和Menge Lee共同完成…