用户画像

数据中有设备的识别码
用户画像
用户画像
用户画像

用户画像
一共有7个标签
里面涉及到词库 所以要用到ES会更加合理
这写标签都是围绕用户的id,一共会有15种id
用户画像

用户画像
用户画像

在用户标签下,如果id用户情况相同时,相同标签的累加(求交集),不同的求并集
用户画像

上下文标签的实现

用户画像
在一天的时间内 早上产生可一个日志 晚上也产生一条数据等等 把这些日志进行标签化

标签聚集化

用户画像
用户画像

商圈标签

用户画像

地图领域 求两坐标直接的距离 GIS的GEOHASH求解

用户画像
用户画像

调用百度地图的逆地址编码 进行知识库的建立,
然后将每一天的日志调用百度的逆地址接口进行计算周围的商圈,传回来将(经纬度对应的geohashcode和商圈信息)存入到mysql数据库中
用户画像
这里如果在数据库查不到商圈,就直接去百度请求
用户画像

需求:好友推荐

用户画像
用户画像
SparkGraph的Edge(起点,终点,关系)

object UserTagMergeDome {
  def main(args: Array[String]): Unit = {
    // 2 创建sparkconf->sparkContext
    val sparkConf = new SparkConf()
    sparkConf.set("spark.testing.memory", "2147480000")
    sparkConf.setAppName(s"${this.getClass.getSimpleName}")
    sparkConf.setMaster("local[*]")
    // RDD 序列化到磁盘 worker与worker之间的数据传输
    sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
    val sc = new SparkContext(sparkConf)

    val data:RDD[Array[String]] = sc.textFile(args(0)).map(_.split("\t"))

    //创建点集合
    val uv:RDD[(VertexId,(String,List[(String ,Int)]))] = data.flatMap(arr => {
      //区分名和标签
      val userNames = arr.filter(_.indexOf(":") == -1)
      val tagsAndNum = arr.filter(_.indexOf(":") != -1).map(tags => {
        val tagsNum = tags.split(":")
        (tagsNum(0), tagsNum(1).toInt)
      }).toList

      val nameAndags = userNames.map(name => {
        if (name.equals(userNames(0))) (name.hashCode.toLong, (name, tagsAndNum))
        else (name.hashCode.toLong, (name, List.empty[(String, Int)]))
      })
      nameAndags
    })
    //创建边集合
    val ue = data.flatMap(arr => {
      val userNames = arr.filter(_.indexOf(":") == -1)
      //结果(id,共同最小的顶点ID)
      userNames.map(name => Edge(userNames(0).hashCode.toLong, name.hashCode.toLong, 0))
    })

    //创建图
    val graph = Graph(uv,ue)
    val vertices = graph.connectedComponents().vertices

    //聚合数据,获取结果
    vertices.join(uv).map{
      case(id,(cmId,(name,tags))) => (cmId,(name,tags))
    }.reduceByKey{
      case(t1,t2)=> {
        val k = t1._1 ++ "-" ++ t2._1
        val v = (t1._2 ++ t2._2).groupBy (_._1).mapValues (_.foldLeft(0)(_ + _._2)).toList
        (k,v)
      }
    }.map(t=>(t._2._1,t._2._2)).foreach(println)
    sc.stop()
  }
}

统一用户识别需求:

用于用户的标签合并
用户画像

其实上面的三条数据是属于同一个人,但是却变成了三个日志;

用户画像
同一行只有一个人携带标签 其他人不携带标签数据,要不然后面同一个日志,标签的出现次数会累加多次,
用户画像
用户画像
用户画像

用户画像
用户画像
聚合标签
用户画像

可以再加多一个 男女标签的

标签数据的衰减

用户的兴趣不是一成不变的
用户画像
用户画像

总结

用户画像
每天都会产生日志,基于标签体系进行标签的打,里面会根据标签的逻辑体系的判断,比如男女标签是怎么大的;
用户画像
用户画像

上一篇:Spark创建RDD的几种方式


下一篇:Spark Streaming的Batch Duration优化