274 lines
8.1 KiB
Go
274 lines
8.1 KiB
Go
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
|
||
}
|