You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
273 lines
8.1 KiB
273 lines
8.1 KiB
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 |
|
}
|
|
|