123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- package data
- import (
- "context"
- "encoding/binary"
- "strconv"
- "time"
- "go-common/app/admin/main/up/util/hbaseutil"
- "go-common/app/interface/main/creative/model/data"
- "go-common/library/ecode"
- "go-common/library/log"
- "github.com/tsuna/gohbase/hrpc"
- )
- var (
- //播放端占比
- playProportion = map[string]string{
- "pc": "pc", //pc端播放占比*10000
- "h5": "h5", //h5端播放占比*10000
- "out": "out", //站外播放占比*10000
- "adr": "android", //android端播放占比*10000
- "ios": "ios", //ios端播放占比*10000
- }
- //播放来源页面占比
- pageSource = map[string]string{
- "pv0": "other", //其他
- "pv1": "tenma", //天马推荐
- "pv2": "related_video", //相关视频
- "pv3": "search", //搜索
- "pv4": "h5", //H5页面
- "pv5": "space", //空间
- "pv6": "dynamic", //动态
- "pv7": "history", //播放历史
- "pv8": "tag", //标签
- "pv9": "cache", //离线缓存
- "pv10": "rank", //排行榜
- "pv11": "type", //分区
- }
- //粉丝来源页面占比
- fanSource = map[string]string{
- "pf0": "other", //其他
- "pf1": "space", //主站空间
- "pf2": "main", //主站播放页
- "pf3": "main_other", //主站其他
- "pf4": "live", //直播
- "pf5": "audio", // 音乐
- "pf6": "article", // 文章
- }
- parser = hbaseutil.Parser{}
- )
- func sourceOtherMerge(v string) bool { //合并这些页面来源为其他
- if v == "other" || v == "h5" || v == "history" || v == "cache" ||
- v == "rank" || v == "type" || v == "tag" {
- return true
- }
- return false
- }
- // reverse for string.
- func reverseString(s string) string {
- rs := []rune(s)
- l := len(rs)
- for f, t := 0, l-1; f < t; f, t = f+1, t-1 {
- rs[f], rs[t] = rs[t], rs[f]
- }
- ns := string(rs)
- if l < 10 {
- for i := 0; i < 10-l; i++ {
- ns = ns + "0"
- }
- }
- return ns
- }
- // 播放来源 - up_play_analysis
- // mid倒置补(10位)+ yyyyMMdd
- func playSourceKey(id int64) string {
- idStr := strconv.FormatInt(id, 10)
- s := reverseString(idStr)
- s = s + time.Now().AddDate(0, 0, -1).Add(-12*time.Hour).Format("20060102")
- return s
- }
- // 平均观看时长、播放用户数、留存率 - up_archive_play_analysis
- // avid倒置补(10位)+ yyyyMMdd
- func arcPlayKey(id int64) string {
- idStr := strconv.FormatInt(id, 10)
- s := reverseString(idStr)
- s = s + time.Now().AddDate(0, 0, -1).Add(-12*time.Hour).Format("20060102")
- return s
- }
- // 稿件索引表 - up_archive_query
- // [mid倒置补0(10位)] + [投稿年月(4位)] + [原创/转载(1位)]
- func arcQueryKey(id int64, dt string, cp int) string {
- idStr := strconv.FormatInt(id, 10)
- cpStr := strconv.Itoa(cp)
- s := reverseString(idStr)
- s = s + dt + cpStr
- return s
- }
- // UpPlaySourceAnalysis for play analysis.
- func (d *Dao) UpPlaySourceAnalysis(c context.Context, mid int64) (res *data.PlaySource, err error) {
- var (
- result *hrpc.Result
- ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.ReadTimeout))
- tableName = HBaseUpPlaySourceAnalysis
- rowkey = playSourceKey(mid)
- )
- defer cancel()
- log.Info("UpPlaySourceAnalysis mid(%d)|rowkey(%s)", mid, rowkey)
- if result, err = d.hbase.GetStr(ctx, tableName, rowkey); err != nil {
- log.Error("d.hbase.GetStr tableName(%s)|mid(%d)|rowkey(%s)|error(%v)", tableName, mid, rowkey, err)
- err = ecode.CreativeDataErr
- return
- }
- if result == nil || len(result.Cells) == 0 {
- log.Warn("UpPlaySourceAnalysis no data tableName(%s)|mid(%d)|rowkey(%s)", tableName, mid, rowkey)
- return
- }
- pp := make(map[string]int32)
- ps := make(map[string]int32)
- for _, c := range result.Cells {
- if c == nil {
- continue
- }
- if string(c.Family) == "s" {
- var v int32
- if len(c.Value) == 4 {
- v = int32(binary.BigEndian.Uint32(c.Value))
- } else {
- log.Error("UpPlaySourceAnalysis family[s] get dirty value tableName(%s)|mid(%d)|rowkey(%s)", tableName, mid, rowkey)
- }
- if pyk, ok := playProportion[string(c.Qualifier[:])]; ok {
- pp[pyk] = v
- }
- if pk, ok := pageSource[string(c.Qualifier[:])]; ok {
- ps[pk] = v
- }
- }
- }
- for _, k := range playProportion { //播放平台设置数据平台未返回的key
- if _, ok := pp[k]; !ok {
- pp[k] = 0
- }
- }
- for _, k := range pageSource { //播放页面设置数据平台未返回的key
- if _, ok := ps[k]; !ok {
- ps[k] = 0
- }
- }
- var other int32
- for k, v := range ps {
- if sourceOtherMerge(k) { //如果该页面来源被计算入其他则删除该页面来源对应的key
- other = other + v
- delete(ps, k)
- }
- }
- ps["other"] = other
- res = &data.PlaySource{
- PlayProportion: pp,
- PageSource: ps,
- }
- log.Info("UpPlaySourceAnalysis PlayProportion(%+v)|PageSource(%+v)|rowkey(%s)", pp, ps, rowkey)
- return
- }
- // UpArcPlayAnalysis for arc play analysis.
- func (d *Dao) UpArcPlayAnalysis(c context.Context, aid int64) (res *data.ArchivePlay, err error) {
- var (
- result *hrpc.Result
- ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.ReadTimeout))
- tableName = HBaseUpArcPlayAnalysis
- rowkey = arcPlayKey(aid)
- )
- defer cancel()
- log.Info("UpArcPlayAnalysis aid(%d)|rowkey(%s)", aid, rowkey)
- if result, err = d.hbase.GetStr(ctx, tableName, rowkey); err != nil {
- log.Error("d.hbase.GetStr tableName(%s)|aid(%d)|rowkey(%+v)|error(%v)", tableName, aid, rowkey, err)
- err = ecode.CreativeDataErr
- return
- }
- if result == nil || len(result.Cells) == 0 {
- log.Warn("UpArcPlayAnalysis no data tableName(%s)|aid(%d)|rowkey(%+v)", tableName, aid, rowkey)
- return
- }
- ap := &data.ArchivePlay{}
- for _, c := range result.Cells {
- if c == nil {
- continue
- }
- if string(c.Family) == "v" {
- ap.AID = aid
- switch string(c.Qualifier[:]) {
- case "ctime":
- if len(c.Value) == 4 {
- ap.CTime = int32(binary.BigEndian.Uint32(c.Value))
- } else {
- log.Error("UpArcPlayAnalysis family[ctime] get dirty value tableName(%s)|aid(%d)|rowkey(%s)", tableName, aid, rowkey)
- }
- case "uv":
- if len(c.Value) == 4 {
- ap.View = int32(binary.BigEndian.Uint32(c.Value))
- } else {
- log.Error("UpArcPlayAnalysis family[uv] get dirty value tableName(%s)|aid(%d)|rowkey(%s)", tableName, aid, rowkey)
- }
- case "dur":
- if len(c.Value) == 8 {
- ap.Duration = int64(binary.BigEndian.Uint64(c.Value))
- } else {
- log.Error("UpArcPlayAnalysis family[dur] get dirty value tableName(%s)|aid(%d)|rowkey(%s)", tableName, aid, rowkey)
- }
- case "avg_dur":
- if len(c.Value) == 8 {
- ap.AvgDuration = int64(binary.BigEndian.Uint64(c.Value))
- } else {
- log.Error("UpArcPlayAnalysis family[avg_dur] get dirty value tableName(%s)|aid(%d)|rowkey(%s)", tableName, aid, rowkey)
- }
- case "rate":
- if len(c.Value) == 4 {
- ap.Rate = int32(binary.BigEndian.Uint32(c.Value))
- } else {
- log.Error("UpArcPlayAnalysis family[rate] get dirty value tableName(%s)|aid(%d)|rowkey(%s)", tableName, aid, rowkey)
- }
- }
- }
- }
- res = ap
- log.Info("UpArcPlayAnalysis aid(%d)|rowkey(%s)|res(%+v)", aid, rowkey, res)
- return
- }
- // UpArcQuery for play aids by mid.
- func (d *Dao) UpArcQuery(c context.Context, mid int64, dt string, cp int) (res []int64, err error) {
- var (
- result *hrpc.Result
- ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.ReadTimeout))
- tableName = HBaseUpArcQuery
- rowkey = arcQueryKey(mid, dt, cp)
- )
- defer cancel()
- log.Info("UpArcQuery mid(%d)|rowkey(%s)", mid, rowkey)
- if result, err = d.hbase.GetStr(ctx, tableName, rowkey); err != nil {
- log.Error("d.hbase.GetStr tableName(%s)|mid(%d)|rowkey(%s)|error(%v)", tableName, mid, rowkey, err)
- err = ecode.CreativeDataErr
- return
- }
- if result == nil || len(result.Cells) == 0 {
- log.Warn("UpArcQuery no data tableName(%s)|mid(%d)|rowkey(%s)", tableName, mid, rowkey)
- return
- }
- res = make([]int64, 0)
- for _, c := range result.Cells {
- if c == nil {
- continue
- }
- if string(c.Family) == "av" {
- var v int64
- if len(c.Value) == 4 {
- v = int64(binary.BigEndian.Uint32(c.Value))
- } else {
- log.Error("UpArcQuery family[av] get dirty value tableName(%s)|rowkey(%s)", tableName, rowkey)
- }
- res = append(res, v)
- }
- }
- log.Info("UpArcQuery mid(%d)|rowkey(%s)|res(%+v)", mid, rowkey, res)
- return
- }
|