目录

  • 1.任务说明
    • 1.1任务描述
    • 1.2架构设计
    • 1.3数据流动图
    • 1.4运行环境
  • 2.数据生成
    • 2.1 生成数据属性说明
    • 2.2 数据生成代码
  • 3.数据存储
    • 3.1数据存入Hbase
      • 3.1.1hbase存储设计
      • 3.1.2数据存入hbase代码
  • 4.数据处理
    • 4.1 Maven环境依赖
    • 4.2数据处理代码
  • 5.可视化展示

1.任务说明

1.1任务描述

用户画像可以了解用户对哪些类型的短视频感兴趣,推荐用户喜欢的短视频,吸引更多的用户使用。同时可以了解各年龄段或不同性别的用户喜欢类型视频占比情况。要求多线程生成1000万条以上的数据并将数据存入hbase,之后采用hadoop或spark等离线技术处理数据并将结果数据存入redis等NoSQL数据库中,最后可视化展示处理后的结果,能够通过hive实现用户交互式查询。

1.2架构设计

项目整体架构如图所示,总共分为五层,数据来源层、数据存储层、数据处理层、业务层、展示层。数据来源层中,通过python多线程生成数据并将数据保存在多个csv文件中。原始数据存储在定义好的hbase表中,hbase表结构为一个列族有15列。Redis数据库中存储的是处理后的以有序集合形式存储的结果数据。数据处理层中,因为spark处理数据速度相比hadoop来说更好,选用spark sql来处理数据,对数据进行统计。同时选用hive实现交互式查询,对二者进行一个简单的比较。业务层中,需要实现一些榜单等数据的展示以及满足用户通过id交互式查询的需求。展示层中,使用html,css,js来完成前端UI界面的设计,通过ajax向servlet请求数据的方式实现从后端获取数据,也可以选用flask+ajax或php+ajax获取数据。

1.3数据流动图

数据流动图如图所示,生成的原始数据存储在csv文件中,后保存在Hbase表中,通过Spark sql对原始数据处理后将结果数据存储在redis有序集合中,最终将Hive交互式查询结果和Redis有序集合保存的结果数据通过界面展示。

1.4运行环境

hadoop集群,spark集群(不用spark无需配置),tomcat(不使用JavaWeb不用配置)

2.数据生成

2.1 生成数据属性说明

属性 类型 说明
uid String 用户ID,唯一
uname Sring 用户名
age lnt 年龄
gender String 性别
aid String 作者ID
aname String 作者名称
vid String 视频ID
type String 视频类型
date Datetime 日期
play Int 播放时长
comment Int 评论数
like Bool 是否点赞
favorite Bool 是否收藏
share Bool 是否转发
follow Bool 是否关注

2.2 数据生成代码

import datetime
import re
import pandas as pd
import threading
import random
import time
from tqdm import tqdm# @Author: wzj
# @Time: 2022-03-10
# @Function: makedatafirst_name_array = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '楮', '卫', '蒋', '沈', '韩', '杨', '朱', '秦', '尤', '许', '何', '吕', '施','张', '孔', '曹', '严', '华', '金', '魏', '陶', '姜', '戚', '谢', '邹', '喻', '柏', '水', '窦', '章', '云', '苏', '潘', '葛', '奚', '范','彭', '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '俞', '任', '袁', '柳', '酆', '鲍', '史', '唐', '费', '廉', '岑', '薛', '雷','贺', '倪', '汤', '滕', '殷', '罗', '毕', '郝', '邬', '安', '常', '乐', '于', '时', '傅', '皮', '卞', '齐', '康', '伍', '余', '元', '卜','顾', '孟', '平', '黄', '和', '穆', '萧', '尹', '姚', '邵', '湛', '汪', '祁', '毛', '禹', '狄', '米', '贝', '明', '臧', '计', '伏', '成','戴', '谈', '宋', '茅', '庞', '熊', '纪', '舒', '屈', '项', '祝', '董', '梁', '杜', '阮', '蓝', '闽', '席', '季', '麻', '强', '贾', '路','娄', '危', '江', '童', '颜', '郭', '梅', '盛', '林', '刁', '锺', '徐', '丘', '骆', '高', '夏', '蔡', '田', '樊', '胡', '凌', '霍', '虞','万', '支', '柯', '昝', '管', '卢', '莫', '经', '房', '裘', '缪', '干', '解', '应', '宗', '丁', '宣', '贲', '邓', '郁', '单', '杭', '洪','包', '诸', '左', '石', '崔', '吉', '钮', '龚', '程', '嵇', '邢', '滑', '裴', '陆', '荣', '翁', '荀', '羊', '於', '惠', '甄', '麹', '家','封', '芮', '羿', '储', '靳', '汲', '邴', '糜', '松', '井', '段', '富', '巫', '乌', '焦', '巴', '弓', '牧', '隗', '山', '谷', '车', '侯','宓', '蓬', '全', '郗', '班', '仰', '秋', '仲', '伊', '宫', '宁', '仇', '栾', '暴', '甘', '斜', '厉', '戎', '祖', '武', '符', '刘', '景','詹', '束', '龙', '叶', '幸', '司', '韶', '郜', '黎', '蓟', '薄', '印', '宿', '白', '怀', '蒲', '邰', '从', '鄂', '索', '咸', '籍', '赖','卓', '蔺', '屠', '蒙', '池', '乔', '阴', '郁', '胥', '能', '苍', '双', '闻', '莘', '党', '翟', '谭', '贡', '劳', '逄', '姬', '申', '扶','堵', '冉', '宰', '郦', '雍', '郤', '璩', '桑', '桂', '濮', '牛', '寿', '通', '边', '扈', '燕', '冀', '郏', '浦', '尚', '农', '温', '别','庄', '晏', '柴', '瞿', '阎', '充', '慕', '连', '茹', '习', '宦', '艾', '鱼', '容', '向', '古', '易', '慎', '戈', '廖', '庾', '终', '暨','居', '衡', '步', '都', '耿', '满', '弘', '匡', '国', '文', '寇', '广', '禄', '阙', '东', '欧', '殳', '沃', '利', '蔚', '越', '夔', '隆','师', '巩', '厍', '聂', '晁', '勾', '敖', '融', '冷', '訾', '辛', '阚', '那', '简', '饶', '空', '曾', '毋', '沙', '乜', '养', '鞠', '须','丰', '巢', '关', '蒯', '相', '查', '后', '荆', '红', '游', '竺', '权', '逑', '盖', '益', '桓', '公', '晋', '楚', '阎', '法', '汝', '鄢','涂', '钦', '岳', '帅', '缑', '亢', '况', '后', '有', '琴', '商', '牟', '佘', '佴', '伯', '赏', '墨', '哈', '谯', '笪', '年', '爱', '阳','佟', '万俟', '司马', '上官', '欧阳', '夏侯', '诸葛', '闻人', '东方', '赫连', '皇甫', '尉迟', '公羊', '澹台', '公冶', '宗政', '濮阳', '淳于', '单于','太叔', '申屠', '公孙', '仲孙', '轩辕', '令狐', '锺离', '宇文', '长孙', '慕容', '鲜于', '闾丘', '司徒', '司空', '丌官', '司寇', '仉', '督', '子车','颛孙', '端木', '巫马', '公西', '漆雕', '乐正', '壤驷', '公良', '拓拔', '夹谷', '宰父', '谷梁', '段干', '百里', '东郭', '南门', '呼延', '归', '海','羊舌', '微生', '梁丘', '左丘', '东门', '西门', '南宫']
last_name_array = ['一', '乙', '二', '十', '丁', '厂', '七', '卜', '人', '入', '八', '九', '几', '儿', '了', '力', '乃', '刀', '又', '三','于', '干', '亏', '士', '工', '土', '才', '寸', '下', '大', '丈', '与', '万', '上', '小', '口', '巾', '山', '千', '乞','川', '亿', '个', '勺', '久', '凡', '及', '夕', '丸', '么', '广', '亡', '门', '义', '之', '尸', '弓', '己', '已', '子','卫', '也', '女', '飞', '刃', '习', '叉', '马', '乡', '丰', '王', '井', '开', '夫', '天', '无', '元', '专', '云', '扎','艺', '木', '五', '支', '厅', '不', '太', '犬', '区', '历', '尤', '友', '匹', '车', '巨', '牙', '屯', '比', '互', '切','瓦', '止', '少', '日', '中', '冈', '贝', '内', '水', '见', '午', '牛', '手', '毛', '气', '升', '长', '仁', '什', '片','仆', '化', '仇', '币', '仍', '仅', '斤', '爪', '反', '介', '父', '从', '今', '凶', '分', '乏', '公', '仓', '月', '氏','勿', '欠', '风', '丹', '匀', '乌', '凤', '勾', '文', '六', '方', '火', '为', '斗', '忆', '订', '计', '户', '认', '心','尺', '引', '丑', '巴', '孔', '队', '办', '以', '允', '予', '劝', '双', '书', '幻', '玉', '刊', '示', '末', '未', '击','打', '巧', '正', '扑', '扒', '功', '扔', '去', '甘', '世', '古', '节', '本', '术', '可', '丙', '左', '厉', '右', '石','布', '龙', '平', '灭', '轧', '东', '卡', '北', '占', '业', '旧', '帅', '归', '且', '旦', '目', '叶', '甲', '申', '叮','电', '号', '田', '由', '史', '只', '央', '兄', '叼', '叫', '另', '叨', '叹', '四', '生', '失', '禾', '丘', '付', '仗','代', '仙', '们', '仪', '白', '仔', '他', '斥', '瓜', '乎', '丛', '令', '用', '甩', '印', '乐', '句', '匆', '册', '犯','外', '处', '冬', '鸟', '务', '包', '饥', '主', '市', '立', '闪', '兰', '半', '汁', '汇', '头', '汉', '宁', '穴', '它','讨', '写', '让', '礼', '训', '必', '议', '讯', '记', '永', '司', '尼', '民', '出', '辽', '奶', '奴', '加', '召', '皮','边', '发', '孕', '圣', '对', '台', '矛', '纠', '母', '幼', '丝', '式', '刑', '动', '扛', '寺', '吉', '扣', '考', '托','老', '执', '巩', '圾', '扩', '扫', '地', '扬', '场', '耳', '共', '芒', '亚', '芝', '朽', '朴', '机', '权', '过', '臣','再', '协', '西', '压', '厌', '在', '有', '百', '存', '而', '页', '匠', '夸', '夺', '灰', '达', '列', '死', '成', '夹','轨', '邪', '划', '迈', '毕', '至', '此', '贞', '师', '尘', '尖', '劣', '光', '当', '早', '吐', '吓', '虫', '曲', '团','同', '吊', '吃', '因', '吸', '吗', '屿', '帆', '岁', '回', '岂', '刚', '则', '肉', '网', '年', '朱', '先', '丢', '舌','竹', '迁', '乔', '伟', '传', '乒', '乓', '休', '伍', '伏', '优', '伐', '延', '件', '任', '伤', '价', '份', '华', '仰','仿', '伙', '伪', '自', '血', '向', '似', '后', '行', '舟', '全', '会', '杀', '合', '兆', '企', '众', '爷', '伞', '创','肌', '朵', '杂', '危', '旬', '旨', '负', '各', '名', '多', '争', '色', '壮', '冲', '冰', '庄', '庆', '亦', '刘', '齐','交', '次', '衣', '产', '决', '充', '妄', '闭', '问', '闯', '羊', '并', '关', '米', '灯', '州', '汗', '污', '江', '池','汤', '忙', '兴', '宇', '守', '宅', '字', '安', '讲', '军', '许', '论', '农', '讽', '设', '访', '寻', '那', '迅', '尽','导', '异', '孙', '阵', '阳', '收', '阶', '阴', '防', '奸', '如', '妇', '好', '她', '妈', '戏', '羽', '观', '欢', '买','红', '纤', '级', '约', '纪', '驰', '巡', '寿', '弄', '麦', '形', '进', '戒', '吞', '远', '违', '运', '扶', '抚', '坛','技', '坏', '扰', '拒', '找', '批', '扯', '址', '走', '抄', '坝', '贡', '攻', '赤', '折', '抓', '扮', '抢', '孝', '均','抛', '投', '坟', '抗', '坑', '坊', '抖', '护', '壳', '志', '扭', '块', '声', '把', '报', '却', '劫', '芽', '花', '芹','芬', '苍', '芳', '严', '芦', '劳', '克', '苏', '杆', '杠', '杜', '材', '村', '杏', '极', '李', '杨', '求', '更', '束','豆', '两', '丽', '医', '辰', '励', '否', '还', '歼', '来', '连', '步', '坚', '旱', '盯', '呈', '时', '吴', '助', '县','里', '呆', '园', '旷', '围', '呀', '吨', '足', '邮', '男', '困', '吵', '串', '员', '听', '吩', '吹', '呜', '吧', '吼','别', '岗', '帐', '财', '针', '钉', '告', '我', '乱', '利', '秃', '秀', '私', '每', '兵', '估', '体', '何', '但', '伸','作', '伯', '伶', '佣', '低', '你', '住', '位', '伴', '身', '皂', '佛', '近', '彻', '役', '返', '余', '希', '坐', '谷','妥', '含', '邻', '岔', '肝', '肚', '肠', '龟', '免', '狂', '犹', '角', '删', '条', '卵', '岛', '迎', '饭', '饮', '系','言', '冻', '状', '亩', '况', '床', '库', '疗', '应', '冷', '这', '序', '辛', '弃', '冶', '忘', '闲', '间', '闷', '判','灶', '灿', '弟', '汪', '沙', '汽', '沃', '泛', '沟', '没', '沈', '沉', '怀', '忧', '快', '完', '宋', '宏', '牢', '究','穷', '灾', '良', '证', '启', '评', '补', '初', '社', '识', '诉', '诊', '词', '译', '君', '灵', '即', '层', '尿', '尾','迟', '局', '改', '张', '忌', '际', '陆', '阿', '陈', '阻', '附', '妙', '妖', '妨', '努', '忍', '劲', '鸡', '驱', '纯','纱', '纳', '纲', '驳', '纵', '纷', '纸', '纹', '纺', '驴', '纽', '奉', '玩', '环', '武', '青', '责', '现', '表', '规','抹', '拢', '拔', '拣', '担', '坦', '押', '抽', '拐', '拖', '拍', '者', '顶', '拆', '拥', '抵', '拘', '势', '抱', '垃','拉', '拦', '拌', '幸', '招', '坡', '披', '拨', '择', '抬', '其', '取', '苦', '若', '茂', '苹', '苗', '英', '范', '直','茄', '茎', '茅', '林', '枝', '杯', '柜', '析', '板', '松', '枪', '构', '杰', '述', '枕', '丧', '或', '画', '卧', '事','刺', '枣', '雨', '卖', '矿', '码', '厕', '奔', '奇', '奋', '态', '欧', '垄', '妻', '轰', '顷', '转', '斩', '轮', '软','到', '非', '叔', '肯', '齿', '些', '虎', '虏', '肾', '贤', '尚', '旺', '具', '果', '味', '昆', '国', '昌', '畅', '明','易', '昂', '典', '固', '忠', '咐', '呼', '鸣', '咏', '呢', '岸', '岩', '帖', '罗', '帜', '岭', '凯', '败', '贩', '购','图', '钓', '制', '知', '垂', '牧', '物', '乖', '刮', '秆', '和', '季', '委', '佳', '侍', '供', '使', '例', '版', '侄','侦', '侧', '凭', '侨', '佩', '货', '依', '的', '迫', '质', '欣', '征', '往', '爬', '彼', '径', '所', '舍', '金', '命','斧', '爸', '采', '受', '乳', '贪', '念', '贫', '肤', '肺', '肢', '肿', '胀', '朋', '股', '肥', '服', '胁', '周', '昏','鱼', '兔', '狐', '忽', '狗', '备', '饰', '饱', '饲', '变', '京', '享', '店', '夜', '庙', '府', '底', '剂', '郊', '废','净', '盲', '放', '刻', '育', '闸', '闹', '郑', '券', '卷', '单', '炒', '炊', '炕', '炎', '炉', '沫', '浅', '法', '泄','河', '沾', '泪', '油', '泊', '沿', '泡', '注', '泻', '泳', '泥', '沸', '波', '泼', '泽', '治', '怖', '性', '怕', '怜','怪', '学', '宝', '宗', '定', '宜', '审', '宙', '官', '空', '帘', '实', '试', '郎', '诗', '肩', '房', '诚', '衬', '衫','视', '话', '诞', '询', '该', '详', '建', '肃', '录', '隶', '居', '届', '刷', '屈', '弦', '承', '孟', '孤', '陕', '降','限', '妹', '姑', '姐', '姓', '始', '驾', '参', '艰', '线', '练', '组', '细', '驶', '织', '终', '驻', '驼', '绍', '经','贯', '奏', '春', '帮', '珍', '玻', '毒', '型', '挂', '封', '持', '项', '垮', '挎', '城', '挠', '政', '赴', '赵', '挡','挺', '括', '拴', '拾', '挑', '指', '垫', '挣', '挤', '拼', '挖', '按', '挥', '挪', '某', '甚', '革', '荐', '巷', '带','草', '茧', '茶', '荒', '茫', '荡', '荣', '故', '胡', '南', '药', '标', '枯', '柄', '栋', '相', '查', '柏', '柳', '柱','柿', '栏', '树', '要', '咸', '威', '歪', '研', '砖', '厘', '厚', '砌', '砍', '面', '耐', '耍', '牵', '残', '殃', '轻','鸦', '皆', '背', '战', '点', '临', '览', '竖', '省', '削', '尝', '是', '盼', '眨', '哄', '显', '哑', '冒', '映', '星','昨', '畏', '趴', '胃', '贵', '界', '虹', '虾', '蚁', '思', '蚂', '虽', '品', '咽', '骂', '哗', '咱', '响', '哈', '咬','咳', '哪', '炭', '峡', '罚', '贱', '贴', '骨', '钞', '钟', '钢', '钥', '钩', '卸', '缸', '拜', '看', '矩', '怎', '牲','选', '适', '秒', '香', '种', '秋', '科', '重', '复', '竿', '段', '便', '俩', '贷', '顺', '修', '保', '促', '侮', '俭','俗', '俘', '信', '皇', '泉', '鬼', '侵', '追', '俊', '盾', '待', '律', '很', '须', '叙', '剑', '逃', '食', '盆', '胆','胜', '胞', '胖', '脉', '勉', '狭', '狮', '独', '狡', '狱', '狠', '贸', '怨', '急', '饶', '蚀', '饺', '饼', '弯', '将','奖', '哀', '亭', '亮', '度', '迹', '庭', '疮', '疯', '疫', '疤', '姿', '亲', '音', '帝', '施', '闻', '阀', '阁', '差','养', '美', '姜', '叛', '送', '类', '迷', '前', '首', '逆', '总', '炼', '炸', '炮', '烂', '剃', '洁', '洪', '洒', '浇','浊', '洞', '测', '洗', '活', '派', '洽', '染', '济', '洋', '洲', '浑', '浓', '津', '恒', '恢', '恰', '恼', '恨', '举','觉', '宣', '室', '宫', '宪', '突', '穿', '窃', '客', '冠', '语', '扁', '袄', '祖', '神', '祝', '误', '诱', '说', '诵','垦', '退', '既', '屋', '昼', '费', '陡', '眉', '孩', '除', '险', '院', '娃', '姥', '姨', '姻', '娇', '怒', '架', '贺','盈', '勇', '怠', '柔', '垒', '绑', '绒', '结', '绕', '骄', '绘', '给', '络', '骆', '绝', '绞', '统', '耕', '耗', '艳','泰', '珠', '班', '素', '蚕', '顽', '盏', '匪', '捞', '栽', '捕', '振', '载', '赶', '起', '盐', '捎', '捏', '埋', '捉','捆', '捐', '损', '都', '哲', '逝', '捡', '换', '挽', '热', '恐', '壶', '挨', '耻', '耽', '恭', '莲', '莫', '荷', '获','晋', '恶', '真', '框', '桂', '档', '桐', '株', '桥', '桃', '格', '校', '核', '样', '根', '索', '哥', '速', '逗', '栗','配', '翅', '辱', '唇', '夏', '础', '破', '原', '套', '逐', '烈', '殊', '顾', '轿', '较', '顿', '毙', '致', '柴', '桌','虑', '监', '紧', '党', '晒', '眠', '晓', '鸭', '晃', '晌', '晕', '蚊', '哨', '哭', '恩', '唤', '啊', '唉', '罢', '峰','圆', '贼', '贿', '钱', '钳', '钻', '铁', '铃', '铅', '缺', '氧', '特', '牺', '造', '乘', '敌', '秤', '租', '积', '秧','秩', '称', '秘', '透', '笔', '笑', '笋', '债', '借', '值', '倚', '倾', '倒', '倘', '俱', '倡', '候', '俯', '倍', '倦','健', '臭', '射', '躬', '息', '徒', '徐', '舰', '般', '航', '途', '拿', '爹', '爱', '颂', '翁', '脆', '脂', '胸','胳', '脏', '胶', '脑', '狸', '狼', '逢', '留', '皱', '饿', '恋', '桨', '浆', '衰', '高', '席', '准', '座', '脊', '症','病', '疾', '疼', '疲', '效', '离', '唐', '资', '凉', '站', '剖', '竞', '部', '旁', '旅', '畜', '阅', '羞', '瓶', '拳','粉', '料', '益', '兼', '烤', '烘', '烦', '烧', '烛', '烟', '递', '涛', '浙', '涝', '酒', '涉', '消', '浩', '海', '涂','浴', '浮', '流', '润', '浪', '浸', '涨', '烫', '涌', '悟', '悄', '悔', '悦', '害', '宽', '家', '宵', '宴', '宾', '窄','容', '宰', '案', '请', '朗', '诸', '读', '扇', '袜', '袖', '袍', '被', '祥', '课', '谁', '调', '冤', '谅', '谈', '谊','剥', '恳', '展', '剧', '屑', '弱', '陵', '陶', '陷', '陪', '娱', '娘', '通', '能', '难', '预', '桑', '绢', '绣', '验','继', '球', '理', '捧', '堵', '描', '域', '掩', '捷', '排', '掉', '堆', '推', '掀', '授', '教', '掏', '掠', '培', '接','控', '探', '据', '掘', '职', '基', '著', '勒', '黄', '萌', '萝', '菌', '菜', '萄', '菊', '萍', '菠', '营', '械', '梦','梢', '梅', '检', '梳', '梯', '桶', '救', '副', '票', '戚', '爽', '聋', '袭', '盛', '雪', '辅', '辆', '虚', '雀', '堂','常', '匙', '晨', '睁', '眯', '眼', '悬', '野', '啦', '晚', '啄', '距', '跃', '略', '蛇', '累', '唱', '患', '唯', '崖','崭', '崇', '圈', '铜', '铲', '银', '甜', '梨', '犁', '移', '笨', '笼', '笛', '符', '第', '敏', '做', '袋', '悠', '偿','偶', '偷', '您', '售', '停', '偏', '假', '得', '衔', '盘', '船', '斜', '盒', '鸽', '悉', '欲', '彩', '领', '脚', '脖','脸', '脱', '象', '够', '猜', '猪', '猎', '猫', '猛', '馅', '馆', '凑', '减', '毫', '麻', '痒', '痕', '廊', '康', '庸','鹿', '盗', '章', '竟', '商', '族', '旋', '望', '率', '着', '盖', '粘', '粗', '粒', '断', '剪', '兽', '清', '添', '淋','淹', '渠', '渐', '混', '渔', '淘', '液', '淡', '深', '婆', '梁', '渗', '情', '惜', '惭', '悼', '惧', '惕', '惊', '惨','惯', '寇', '寄', '宿', '窑', '密', '谋', '谎', '祸', '谜', '逮', '敢', '屠', '弹', '随', '蛋', '隆', '隐', '婚', '婶','颈', '绩', '绪', '续', '骑', '绳', '维', '绵', '绸', '绿', '琴', '斑', '替', '款', '堪', '搭', '塔', '越', '趁', '趋','超', '提', '堤', '博', '揭', '喜', '插', '揪', '搜', '煮', '援', '裁', '搁', '搂', '搅', '握', '揉', '斯', '期', '欺','联', '散', '惹', '葬', '葛', '董', '葡', '敬', '葱', '落', '朝', '辜', '葵', '棒', '棋', '植', '森', '椅', '椒', '棵','棍', '棉', '棚', '棕', '惠', '惑', '逼', '厨', '厦', '硬', '确', '雁', '殖', '裂', '雄', '暂', '雅', '辈', '悲', '紫','辉', '敞', '赏', '掌', '晴', '暑', '最', '量', '喷', '晶', '喇', '遇', '喊', '景', '践', '跌', '跑', '遗', '蛙', '蛛','蜓', '喝', '喂', '喘', '喉', '幅', '帽', '赌', '赔', '黑', '铸', '铺', '链', '销', '锁', '锄', '锅', '锈', '锋', '锐','短', '智', '毯', '鹅', '剩', '稍', '程', '稀', '税', '筐', '等', '筑', '策', '筛', '筒', '答', '筋', '筝', '傲', '傅','牌', '堡', '集', '焦', '傍', '储', '奥', '街', '惩', '御', '循', '艇', '舒', '番', '释', '禽', '腊', '脾', '腔', '鲁','猾', '猴', '然', '馋', '装', '蛮', '就', '痛', '童', '阔', '善', '羡', '普', '粪', '尊', '道', '曾', '焰', '港', '湖','渣', '湿', '温', '渴', '滑', '湾', '渡', '游', '滋', '溉', '愤', '慌', '惰', '愧', '愉', '慨', '割', '寒', '富', '窜','窝', '窗', '遍', '裕', '裤', '裙', '谢', '谣', '谦', '属', '屡', '强', '粥', '疏', '隔', '隙', '絮', '嫂', '登', '缎','缓', '编', '骗', '缘', '瑞', '魂', '肆', '摄', '摸', '填', '搏', '塌', '鼓', '摆', '携', '搬', '摇', '搞', '塘', '摊','蒜', '勤', '鹊', '蓝', '墓', '幕', '蓬', '蓄', '蒙', '蒸', '献', '禁', '楚', '想', '槐', '榆', '楼', '概', '赖', '酬','感', '碍', '碑', '碎', '碰', '碗', '碌', '雷', '零', '雾', '雹', '输', '督', '龄', '鉴', '睛', '睡', '睬', '鄙', '愚','暖', '盟', '歇', '暗', '照', '跨', '跳', '跪', '路', '跟', '遣', '蛾', '蜂', '嗓', '置', '罪', '罩', '错', '锡', '锣','锤', '锦', '键', '锯', '矮', '辞', '稠', '愁', '筹', '签', '简', '毁', '舅', '鼠', '催', '傻', '像', '躲', '微', '愈','遥', '腰', '腥', '腹', '腾', '腿', '触', '解', '酱', '痰', '廉', '新', '韵', '意', '粮', '数', '煎', '塑', '慈', '煤','煌', '满', '漠', '源', '滤', '滥', '滔', '溪', '溜', '滚', '滨', '粱', '滩', '慎', '誉', '塞', '谨', '福', '群', '殿','辟', '障', '嫌', '嫁', '叠', '缝', '缠', '静', '碧', '璃', '墙', '撇', '嘉', '摧', '截', '誓', '境', '摘', '摔', '聚','蔽', '慕', '暮', '蔑', '模', '榴', '榜', '榨', '歌', '遭', '酷', '酿', '酸', '磁', '愿', '需', '弊', '裳', '颗', '嗽','蜻', '蜡', '蝇', '蜘', '赚', '锹', '锻', '舞', '稳', '算', '箩', '管', '僚', '鼻', '魄', '貌', '膜', '膊', '膀', '鲜','疑', '馒', '裹', '敲', '豪', '膏', '遮', '腐', '瘦', '辣', '竭', '端', '旗', '精', '歉', '熄', '熔', '漆', '漂', '漫','滴', '演', '漏', '慢', '寨', '赛', '察', '蜜', '谱', '嫩', '翠', '熊', '凳', '骡', '缩', '慧', '撕', '撒', '趣', '趟','撑', '播', '撞', '撤', '增', '聪', '鞋', '蕉', '蔬', '横', '槽', '樱', '橡', '飘', '醋', '醉', '震', '霉', '瞒', '题','暴', '瞎', '影', '踢', '踏', '踩', '踪', '蝶', '蝴', '嘱', '墨', '镇', '靠', '稻', '黎', '稿', '稼', '箱', '箭', '篇','僵', '躺', '僻', '德', '艘', '膝', '膛', '熟', '摩', '颜', '毅', '糊', '遵', '潜', '潮', '懂', '额', '慰', '劈', '操','燕', '薯', '薪', '薄', '颠', '橘', '整', '融', '醒', '餐', '嘴', '蹄', '器', '赠', '默', '镜', '赞', '篮', '邀', '衡','膨', '雕', '磨', '凝', '辨', '辩', '糖', '糕', '燃', '澡', '激', '懒', '壁', '避', '缴', '戴', '擦', '鞠', '藏', '霜','霞', '瞧', '蹈', '螺', '穗', '繁', '辫', '赢', '糟', '糠', '燥', '臂', '翼', '骤', '鞭', '覆', '蹦', '镰', '翻', '鹰','警', '攀', '蹲', '颤', '瓣', '爆', '疆', '壤', '耀', '躁', '嚼', '嚷', '籍', '魔', '灌', '蠢', '霸', '露', '囊', '罐']
first_name_size = first_name_array.__len__() - 200
last_name_size = last_name_array.__len__() - 1499def fullname():"""获取一个随机名,名的长度1或2:return:"""first_name = first_name_array[random.randint(0, first_name_size - 1)]last_name = ''.join((last_name_array[random.randint(0, last_name_size - 1)] for _ in range(0, random.randint(1, 2))))return first_name + last_namedef user_age():"""随机生成年龄0-17占10%,18-30占40%,30-45占40%,45及以上占10%"""num = random.randint(0, 9)if num == 0:age = random.randint(5, 17)elif num < 5:age = random.randint(18, 30)elif num < 9:age = random.randint(31, 45)else:age = random.randint(46, 70)return agedef _id():"""获取一个用户id,长度为7位数字获取一个视频id,v+7位数字:return:9*10*10*10*10"""uid = str(random.choice(range(1, 9))) + \''.join(str(random.choice(range(0, 9))) for _ in range(4))aid = str(random.choice(range(1, 9))) + \''.join(str(random.choice(range(0, 9))) for _ in range(4))vid = 'v' + str(random.choice(range(1, 9))) + \''.join(str(random.choice(range(0, 9))) for _ in range(5))return uid, aid, vidv_type = ['搞笑类', '明星类', '美食类', '时尚类', '美妆类', '街坊类', '旅游类', '娱乐类', '生活类', '资讯类','亲子类', '知识类', '游戏类', '汽车类', '财经类', '励志类', '萌宠类', '运动类', '音乐类', '二次元类','科技类', '运动健身类', '故事类', '教学类', '才艺类', '技术流', '干货分享类', '视频分享类', '情感类','颜值类', '剧情类', '园艺类', '种草类', '科技数码类', '热点类']def video_attribute():"""观看一个视频的播放时长,单位为秒一个视频的评论数,单位为条为一个视频获取其类型,从v_type中随机选择:return:"""_type = v_type[random.choice(range(len(v_type)))]play = random.randint(1, 120)comment = random.randint(0, 10)return _type, play, commentdef date():"""在一年中选择随机日期:return:"""a1 = (2021, 1, 1, 0, 0, 0, 0, 0, 0)a2 = (2021, 12, 31, 23, 59, 59, 0, 0, 0)start = time.mktime(a1)end = time.mktime(a2)t = random.randint(start, end)date_tuple = time.localtime(t)return time.strftime("%Y-%m-%d %H:%M:%S", date_tuple)def make_action(i):"""生成数据:return:"""_type, play, comment = video_attribute()uid, aid, vid = _id()action = {'num': i,'uid': uid,'uname': fullname(),'age': user_age(),'gender': random.choice(['男', '女']),'aid': aid,'aname': fullname(),'vid': vid,'type': _type,'date': date(),'play': play,'comment': comment,'like': bool(random.getrandbits(1)),'favorite:': bool(random.getrandbits(1)),'share': bool(random.getrandbits(1)),'follow': bool(random.getrandbits(1)),# 'advertisement': bool(random.getrandbits(1))}return actiondef make_file(i):filename = "C:/Users/zjs/Desktop/data/" + time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time())) + '_' + str(i) + '.csv'dataList = []for i in tqdm(range(1000000)):dataList.append(make_action(i))data = pd.DataFrame(dataList)data.to_csv(filename, index=False, sep=',', encoding='utf-8')def thread_num(num):threading.Lock()threads = []for i in range(num):thread = threading.Thread(target=make_file(i + 1), args=(i, 1))thread.start()threads.append(thread)for thread in threads:thread.join()if __name__ == '__main__':thread_num(1)

3.数据存储

3.1数据存入Hbase

3.1.1hbase存储设计

上传数据到hbase,需要添加一列rowkey,不然会出现每列数据是原本后一列数据,同时少了一列数据的情况

列族 列名 说明
info uid 用户ID,唯一
info uname 用户名
info age 年龄
info gender 性别
info aid 作者ID
info aname 作者名称
info vid 视频ID
info type 视频类型
info date 日期
info play 播放时长
info comment 评论数
info like 是否点赞
info favorite 是否收藏
info share 是否转发
info follow 是否关注

3.1.2数据存入hbase代码

windows本地csv数据上传到hbase有多种方法,这里介绍两种
通过WinSCP软件将Windows本地的csv文件移入到虚拟机中,再通过hdfs命令上传到hdfs中,在hbase中定义好表的结构,再通过hbase函数ImportTsv上传数据到hbase中
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator="," -Dimporttsv.columns=HBASE_ROW_KEY,列族:列名,表名 hdfs文件路径

hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator="," -Dimporttsv.columns=HBASE_ROW_KEY,info:uid,info:uname,info:age,info:gender,info:aid,info:aname,info:vid,info:type,info:date,info:play,info:comment,info:like,info:favorite,info:share,info:follow data3 /user/root/2022-03-03-11_15_04_1.csv

以下是通过java从本地上传数据到hbase中的代码

import java.io.*;
import java.util.ArrayList;
import java.util.List;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;/*** @author yzg* @date 2022-03-10*/public class car_hbase {public static Connection connection=null;public static Admin admin=null;// 定义配置对象HBaseConfigurationprivate static Configuration configuration;public List<String> getAllTables() {List<String> tables = null;if (admin != null) {try {HTableDescriptor[] allTable = admin.listTables();if (allTable.length > 0)tables = new ArrayList<String>();for (HTableDescriptor hTableDescriptor : allTable) {tables.add(hTableDescriptor.getNameAsString());System.out.println(hTableDescriptor.getNameAsString());}}catch (IOException e) {e.printStackTrace();}}return tables;}public static boolean isExist(String tableName){try {return admin.tableExists(TableName.valueOf(tableName));} catch (IOException e) {e.printStackTrace();}return false;}public static void createTable(String tableName,String... columnfamily){try {if(isExist(tableName)){System.out.println("表存在,请输入其他表名");}else{//2.注意:创建表的话,需要创建一个描述器HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));//3.创建列族for(String cf:columnfamily){htd.addFamily(new HColumnDescriptor(cf));}//4.创建表admin.createTable(htd);System.out.println("表已经创建成功!");}} catch (IOException e) {e.printStackTrace();}}public static void close(){try{if(admin!=null){admin.close();}if(connection != null){connection.close();}}catch (IOException e){e.printStackTrace();}}//全表扫描public static void scanAll(String tableName){try {Table t = connection.getTable(TableName.valueOf(tableName));//1.实例scanScan s = new Scan();//2.拿到Scanner对象ResultScanner rs = t.getScanner(s);//3.遍历for (Result r:rs){Cell[] cells = r.rawCells();//遍历具体数据for (Cell c : cells){System.out.print("行键为:"+Bytes.toString(CellUtil.cloneRow(c))+"  ");System.out.print("列族为:"+Bytes.toString(CellUtil.cloneFamily(c))+"  ");System.out.print("列名为:"+Bytes.toString(CellUtil.cloneQualifier(c))+"  ");System.out.println("值为:"+Bytes.toString(CellUtil.cloneValue(c)));}}} catch (IOException e) {e.printStackTrace();}}//csv文件传入hbase      实例:test1.csvpublic static void addRow(String tableName,String rowkey,String cf,String column_1,String value_1,String column_2,String value_2,String column_3,String value_3,String column_4,String value_4,String column_5,String value_5){try {Table t = connection.getTable(TableName.valueOf(tableName));//1.表如果存在,请输入其他表名if (!isExist(tableName)) {System.out.println("表不存在");} else {//2.用put方式加入数据Put p = new Put(Bytes.toBytes(rowkey));//3.加入数据p.addColumn(Bytes.toBytes(cf),Bytes.toBytes(column_1),Bytes.toBytes(value_1));p.addColumn(Bytes.toBytes(cf),Bytes.toBytes(column_2),Bytes.toBytes(value_2));p.addColumn(Bytes.toBytes(cf),Bytes.toBytes(column_3),Bytes.toBytes(value_3));p.addColumn(Bytes.toBytes(cf),Bytes.toBytes(column_4),Bytes.toBytes(value_4));p.addColumn(Bytes.toBytes(cf),Bytes.toBytes(column_5),Bytes.toBytes(value_5));t.put(p);}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws MasterNotRunningException, ZooKeeperConnectionException, IOException {// TODO 自动生成的方法存根System.setProperty("hadoop.home.dir", "G:\\idea_had\\hadoop-2.6.5");Configuration configuration = HBaseConfiguration.create();configuration.set("hbase.rootdir", "hdfs://192.168.128.140:9000/HBase");configuration.set("hbase.zookeeper.quorum","master,slave1,slave2,slave3");connection= ConnectionFactory.createConnection(configuration);admin = connection.getAdmin();//创建表System.out.println("创建表");createTable("car","info");//读取csv文件按行  插入hbaseFile csv = new File("C:\\Users\\杨-PC\\Desktop\\大三下\\大数据存储课设\\data\\car.csv");InputStreamReader isr = new InputStreamReader(new FileInputStream(csv),"UTF-8");BufferedReader br = new BufferedReader(isr);String line = "";List<String> allString = new ArrayList<String>();try {line = br.readLine();while(line != null){System.out.println(line);String sum[];sum = line.split(",");addRow("car",sum[0],"info","id",sum[0],"License",sum[1],"type",sum[2],"city",sum[3],"province",sum[4]);line = br.readLine();}} catch (IOException e) {e.printStackTrace();}
//        addRow("test1","101","info","name","20");scanAll("car");close();}
}

4.数据处理

4.1 Maven环境依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>hadoop_1</artifactId><version>1.0-SNAPSHOT</version><properties><scala.version>2.11</scala.version><spark.version>2.1.1</spark.version>
<!--        <hadoop.version>2.7.7</hadoop.version>--></properties><repositories><repository><id>scala-tools.org</id><name>Scala-Tools Maven2 Repository</name><url>http://scala-tools.org/repo-releases</url></repository></repositories><pluginRepositories><pluginRepository><id>scala-tools.org</id><name>Scala-Tools Maven2 Repository</name><url>http://scala-tools.org/repo-releases</url></pluginRepository></pluginRepositories><dependencies><!--scala--><dependency><groupId>org.scala-lang</groupId><artifactId>scala-library</artifactId><version>2.11.8</version><!--            <scope>provided</scope>--></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_${scala.version}</artifactId><version>${spark.version}</version><!--            <scope>provided</scope>--></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_${scala.version}</artifactId><version>${spark.version}</version><!--            <scope>provided</scope>--></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.4</version><!--<scope>test</scope>--></dependency><dependency><groupId>org.specs</groupId><artifactId>specs</artifactId><version>1.2.5</version><scope>test</scope></dependency><dependency><groupId>org.scala-lang</groupId><artifactId>scala-reflect</artifactId><version>2.11.8</version></dependency><dependency><groupId>org.scala-lang</groupId><artifactId>scala-compiler</artifactId><version>2.11.8</version></dependency><dependency><groupId>org.scala-lang</groupId><artifactId>scala-library</artifactId><version>2.11.8</version></dependency><!-- hbase--><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>1.1.2</version></dependency><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-common</artifactId><version>1.1.2</version></dependency><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-server</artifactId><version>1.1.2</version></dependency><!--redis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.9.0</version></dependency><!--hadoop--><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.6.5</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client --><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.5</version><exclusions><exclusion><groupId>io.netty</groupId><artifactId>netty</artifactId></exclusion></exclusions></dependency><!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs --><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>2.6.5</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc --><!--hive--><dependency><groupId>org.apache.hive</groupId><artifactId>hive-jdbc</artifactId><version>1.2.1</version></dependency></dependencies><!--maven-assembly-plugin报红没解决但不影响使用--><build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>
</project>

4.2数据处理代码

package demo;import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.hbase.client.{HBaseAdmin, HTable}
import org.apache.hadoop.hbase.mapreduce.TableInputFormat
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.hbase.{HBaseConfiguration, HTableDescriptor, TableName}
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.functions.monotonically_increasing_id
import org.apache.spark.sql.{DataFrame, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}
import redis.clients.jedis.{Jedis, JedisPool, JedisPoolConfig}/*** @author zjs* @date 2022-03-10*/object DataProcess {/***连接zookeeper* @param quorum ip* @param port 端口* @param tableName Hbase表* @return*/def getHBaseConfiguration(quorum:String, port:String, tableName:String) = {val conf = HBaseConfiguration.create()conf.set("hbase.zookeeper.quorum",quorum)conf.set("hbase.zookeeper.property.clientPort",port)conf}/***连接Hbase* @param conf Hbaseconf配置参数* @param tableName Hbase表* @return*/def getHBaseAdmin(conf:Configuration,tableName:String) = {val admin = new HBaseAdmin(conf)if (!admin.isTableAvailable(tableName)) {val tableDesc = new HTableDescriptor(TableName.valueOf(tableName))admin.createTable(tableDesc)}admin}/*** 获得Hbase表* @param conf* @param tableName* @return*/def getTable(conf:Configuration,tableName:String) = {new HTable(conf,tableName)}/*** 将数据以有序集合形式存入redis* @param df* @param jedis* @param key 键值*/def ToRedis(df:DataFrame,jedis:Jedis,key:String) = {//将dataframe数据转为列表存储val ResultRdd = df.rdd.map(row =>(row.getString(0),row.getInt(1)))val result = ResultRdd.collect()//遍历存入redisfor(elem <- result) {jedis.zadd(key,elem._2,elem._1)}}/*** 榜单数据处理*/def getRank(df:DataFrame,jedis: Jedis) = {//计算评论数val comment = df.sqlContext.sql("select vid as vid1,int(sum(comment)) as comment from video group by vid order by comment desc limit 10")//.withColumn("comment", col("comment").cast("int"))ToRedis(comment,jedis,"comment")//计算点赞数val like = df.sqlContext.sql("select vid as vid2,int(count(like)) as like from video group by vid order by like desc limit 10")//.withColumn("index",monotonically_increasing_id)ToRedis(like,jedis,"like")//统计收藏数val favorite = df.sqlContext.sql("select vid as vid3,int(count(favorite)) as favorite from video group by vid order by favorite desc limit 10")ToRedis(favorite,jedis,"favorite")//统计播放量val play = df.sqlContext.sql("select vid as vid4,int(count(uname)) as num from video group by vid order by num desc limit 10")ToRedis(play,jedis,"play")//统计粉丝数val fans = df.sqlContext.sql("select aname,int(count(follow)) as follow from video group by aname order by follow desc limit 10")ToRedis(fans,jedis,"fans")}def getDifAgeType(df:DataFrame,jedis: Jedis) = {//统计各年龄段用户喜欢视频类型占比情况val age_1 = df.sqlContext.sql("select type as type1,int(count(uname)) as num1 from video where age<18 group by type order by num1 desc limit 10").withColumn("index",monotonically_increasing_id)val age_2 = df.sqlContext.sql("select type as type2,int(count(uname)) as num2 from video where age between 18 and 30 group by type order by num2 desc limit 10").withColumn("index",monotonically_increasing_id)val age_3 = df.sqlContext.sql("select type as type3,int(count(uname)) as num3 from video where age between 31 and 45 group by type order by num3 desc limit 10").withColumn("index",monotonically_increasing_id)val age_4 = df.sqlContext.sql("select type as type4,int(count(uname)) as num4 from video where age>45 group by type order by num4 desc limit 10").withColumn("index",monotonically_increasing_id)ToRedis(age_1,jedis,"age_1")ToRedis(age_2,jedis,"age_2")ToRedis(age_3,jedis,"age_3")ToRedis(age_4,jedis,"age_4")}/***统计男性/女性用户喜欢视频类型占比情况*/def getSexType(df:DataFrame,jedis: Jedis) = {val male = df.sqlContext.sql("select type as male,int(count(uname)) as num1 from video where gender='男' group by type order by num1 desc limit 10").withColumn("index",monotonically_increasing_id)val female = df.sqlContext.sql("select type as female,int(count(uname)) as num2 from video where gender='女' group by type order by num2 desc limit 10").withColumn("index",monotonically_increasing_id)ToRedis(male,jedis,"male")ToRedis(female,jedis,"female")}/***统计各年龄段用户喜欢视频类型占比情况*/def getDifAgeNum(df:DataFrame,jedis: Jedis) = {val age1 = df.sqlContext.sql("select string(count(uname)) as num1 from video where age<18").withColumn("index",monotonically_increasing_id)val age2 = df.sqlContext.sql("select string(count(uname)) as num2 from video where age between 18 and 30").withColumn("index",monotonically_increasing_id)val age3 = df.sqlContext.sql("select string(count(uname)) as num3 from video where age between 31 and 45").withColumn("index",monotonically_increasing_id)val age4 = df.sqlContext.sql("select string(count(uname)) as num4 from video where age>45").withColumn("index",monotonically_increasing_id)val DifAgeNum = age1.join(age2,"index").join(age3,"index").join(age4,"index")//将数据存入redis的列表中val AgeRdd = DifAgeNum.rdd.map(row=>(row.getString(1),row.getString(2),row.getString(3),row.getString(4))).collect()for(row <- AgeRdd) {jedis.rpush("DifAgeNum",row._1,row._2,row._3,row._4)}}/***统计每个月的访问流量*/def getStream(df: DataFrame,jedis: Jedis,sqlContext:SQLContext) = {val dates = df.sqlContext.sql("select vid,date from video")val some = dates.rdd.map(x=>{val vid = x.getString(0)val time1 = x.getString(1)val times = time1.split("/")(1) //取月份(vid,times)})import sqlContext.implicits._val df2 = some.toDF("vid","date")df2.registerTempTable("MonTime")val DifMonNum = df2.sqlContext.sql("select String(date),int(count(vid)) as num from MonTime group by date order by date")//.withColumn("index",monotonically_increasing_id)ToRedis(DifMonNum,jedis,"month")}def main(args: Array[String]): Unit = {val startTime = System.currentTimeMillis //获取开始时间//参数配置Logger.getLogger("org.apache.spark").setLevel(Level.WARN)val sparkConf = new SparkConf().setAppName("DataProcess").setMaster("local[2]")val sc = new SparkContext(sparkConf)val sqlContext = new SQLContext(sc)val tableName = "data2"val quorum = "slave1,slave2,slave3"val port = "2181"//连接redis// 获取连接池配置对象val config = new JedisPoolConfig()// 设置最大连接数config.setMaxTotal(1000);// 设置最大的空闲连接数config.setMaxIdle(100)val pool: JedisPool = new JedisPool(config, "192.168.150.134",6379)val jedis: Jedis = pool.getResource// 配置相关信息val conf = getHBaseConfiguration(quorum,port,tableName)conf.set(TableInputFormat.INPUT_TABLE,tableName)// HBase数据转成RDDval hBaseRDD = sc.newAPIHadoopRDD(conf,classOf[TableInputFormat],classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],classOf[org.apache.hadoop.hbase.client.Result]).cache()// RDD数据操作//hBaseRDD.foreach(println)val data = hBaseRDD.map(x => {val result = x._2val key = Bytes.toString(result.getRow)val uid = Bytes.toString(result.getValue("info".getBytes,"uid".getBytes))val uname = Bytes.toString(result.getValue("info".getBytes,"uname".getBytes))val age = Bytes.toString(result.getValue("info".getBytes,"age".getBytes))val gender = Bytes.toString(result.getValue("info".getBytes,"gender".getBytes))val aid = Bytes.toString(result.getValue("info".getBytes,"aid".getBytes))val aname = Bytes.toString(result.getValue("info".getBytes,"aname".getBytes))val vid = Bytes.toString(result.getValue("info".getBytes,"vid".getBytes))val types = Bytes.toString(result.getValue("info".getBytes,"type".getBytes))val date = Bytes.toString(result.getValue("info".getBytes,"date".getBytes))val play = Bytes.toString(result.getValue("info".getBytes,"play".getBytes))val comment = Bytes.toString(result.getValue("info".getBytes,"comment".getBytes))val like = Bytes.toString(result.getValue("info".getBytes,"like".getBytes))val favorite = Bytes.toString(result.getValue("info".getBytes,"favorite".getBytes))val share = Bytes.toString(result.getValue("info".getBytes,"share".getBytes))val follow = Bytes.toString(result.getValue("info".getBytes,"follow".getBytes))(uid,uname,age,gender,aid,aname,vid,types,date,play,comment,like,favorite,share,follow)})//RDD转DATAFRAMEimport sqlContext.implicits._val df = data.toDF("uid","uname","age","gender","aid","aname","vid","type","date","play","comment","like","favorite","share","follow")df.registerTempTable("video")//处理函数getRank(df,jedis)getDifAgeType(df,jedis)getSexType(df,jedis)getDifAgeNum(df,jedis)getStream(df,jedis,sqlContext)sc.stop()val endTime = System.currentTimeMillis //获取结束时间System.out.println("Spark sql查询运行时间: "+(endTime-startTime)+"ms")}
}

5.可视化展示

因为可视化代码太多,详情请见界面代码链接
希望可以帮助到有需要的朋友,也希望大家可以指出文中的错误
如果有想一起交流学习的朋友,可以加我的QQ:2759027764

【大数据存储与处理】相关推荐

  1. 澄清大数据存储——系统集成商篇

    大数据考验整合能力 大数据在带来新的商机和用户的同时,也带来了诸多挑战. 大数据存储主要考验的是技术整合能力和资源整合能力. 大数据是一项持久的工程,也是一个不断迭代的过程,不能一蹴而就. 业务集中在 ...

  2. 全球海拔最高的国际级数据中心竣工,西藏有了大数据存储中心

    全球海拔最高的国际级数据中心.西藏首个大数据存储中心,宁算科技集团拉萨一体化项目数据中心(一期)工程12月18日通过竣工验收. 项目位于海拔3670米的拉萨市国家级高新区信息产业园内,总建筑面积为2. ...

  3. 《大数据存储:MongoDB实战指南》一1.1 什么是大数据

    本节书摘来异步社区<大数据存储:MongoDB实战指南>一书中的第1章,第1.1节,作者: 郭远威 , 彭文波 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区" ...

  4. 面向智能电网的电力大数据存储与分析应用

    面向智能电网的电力大数据存储与分析应用 崔立真1, 史玉良1, 刘磊1, 赵卓峰2, 毕艳冰3 1. 山东大学计算机科学与技术学院,山东 济南 250101 2. 北方工业大学云计算研究中心,北京 1 ...

  5. 云时代的大数据存储-云HBase

    纵观数据库发展的几十年,从网状数据库.层次数据库到RDBMS数据库,在最近几年的NewSQL的兴起,加上开源的运动,再加上云的特性,可以说是日新月异.在20世纪80年代后,大部分的业务确定了使用RDB ...

  6. 管理大数据存储的十大技巧

    在1990年,每一台应用服务器都倾向拥有直连式系统(DAS).SAN的构建则是为了更大的规模和更高的效率提供共享的池存储.Hadoop已经逆转了这一趋势回归DAS.每一个Hadoop集群都拥有自身的- ...

  7. 基于HBase的大数据存储在京东的应用场景

    引言 HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,适用于结构化的存储,底层依赖于Hadoop的HDFS,利用HBase技术可在廉价PCServer上搭建起大规模结构化存储集群.因 ...

  8. 主流大数据存储解决方案评析

    EMC Isilon:横向扩展 性能突出 大数据存储不是一类单独的产品,它有很多实现方式.EMC Isilon存储事业部总经理杨兰江概括说,大数据存储应该具有以下一些特性:海量数据存储能力,可轻松管理 ...

  9. 1.大数据存储选型——何时用hbase

    数据库发展 NoSQL Sharding-nothing 存储选型 要搞懂大数据存储选型,首先必须得了解数据库的发展历史,了解关系数据库的优势和缺点,才能进一步考虑如何处理这些问题. 数据库发展 简单 ...

  10. 大数据存储技术方案介绍

    2019独角兽企业重金招聘Python工程师标准>>> 大数据存储方案 Cap思想 分布式领域CAP理论, Consistency(一致性), 数据一致更新,所有数据变动都是同步的 ...

最新文章

  1. Android 自定义WaveProgressView满足你所有水波纹加载需求
  2. CSP认证201709-2 公共钥匙盒[C++题解]:结构体、排序、枚举
  3. 语法手册_是真的猛!SQL 语法速成手册
  4. python爬取歌曲评论并进行数据可视化
  5. 目标检测算法图解:一文看懂RCNN系列算法
  6. MyBatis 如何传递参数(全)
  7. AIR Android开发--APK结构详解
  8. apdu 移动sim_SIM卡APDU指令【转】
  9. 从打造“兴趣电商”到“完全闭环”,抖音电商之路
  10. [状压dp][BZOJ3717][PA2014]Pakowanie
  11. 计算机想ping一下网络,Ping命令以检测Windows7下的计算机网络速度
  12. Going Deeper into Regression Analysis with Assumptions, Plots Solutions
  13. 用了这个办法解决Discuz! Database Error报错
  14. 8051单片机的存储器结构
  15. C语言:优先级与运算符的介绍
  16. 人工智能换脸pythonapp小视频_人工智能几行代码实现换脸,python+dlib实现图文教程...
  17. mysql gman do_MySQL UDFs 来管理调用 Gearman 的分布式的队列
  18. nodejs爬虫大作业项目
  19. 转载----孙振耀退休感言
  20. 【C++】next_permutation / prev_permutation函数

热门文章

  1. 即拿即用-仿IOS风格的弹出框和对话框
  2. 【网络请求之Axios】axios的基础用法
  3. 转 李兴华老师的一篇博客
  4. R语言中的地理/投影坐标系统(下)[翻译]
  5. Windows 7 Embedded快速入门-安装
  6. 【Python爬虫7】验证码处理
  7. Python爬取古诗词写入Neo4j
  8. 渗透测试必知必会—Web漏洞
  9. c语言函数实参是赋值语句,c语言说形参不能改变实参的值,为什么这个赋值语句可以...
  10. 基础算法002-----百钱百鸡问题(扩展问题)