海量数据,top100热词,手把手教学
目录
题目内容
思路(总览)
行文风格
1.随机生成数
1.1.写文件的操作
1.2.读文件的操作
1.3.随机生成数的操作
2.把data.txt文件分散为500个子文件
3.对每一个子文件进行(降序)排序,并将前100的数据分别放到“(top ten)1.txt" "top(top ten)2.txt"......"(top ten)500.txt"文件中
3.1.打开需要读和写的文件
3.2.把子文件的所有数据放入map中,记录数据key和num
3.3.把map中的数据放入vector中,为排序做准备
3.4.对vector进行排序
3.5.利用迭代器统计vector的长度
3.6.把子文件出现频率为前面的数据存入子文件的子文件中
3.7.关闭3.1打开的文件
4.把所有“(top ten)1.txt" "top(top ten)2.txt"......"(top ten)500.txt"文件集合到”all.txt"文件中
5.对“all.txt"文件进行排序,排序后把top100热词输出到“last.txt"文件中
5.1.分割字符串
题目内容
(1)大数据分析问题
[问题描述]
某搜索公司一天的用户搜索词汇是海量的(百亿数据量),请设计一种求出每天最热top 100 词汇的可行办法。
[基本要求]
(1) 随机生成海量数据,存入文件;从文件读入数据来处理。
(2) 显示数据文件的每一次处理结果。
思路(总览)
1.先随机生成1000万个数字(数据),写入data.txt中
2.把1000万个数据分散到500个子文件,文件名为“1.txt" "2.txt"........"500.txt"
3.对每一个子文件进行(降序)排序,并将前100的数据分别放到“(top ten)1.txt" "top(top ten)2.txt"......"(top ten)500.txt"文件中
4.把所有“(top ten)1.txt" "top(top ten)2.txt"......"(top ten)500.txt"文件集合到”all.txt"文件中,并对“all.txt"文件进行排序,排序后把top100热词输出到“last.txt"文件中
行文风格
我会先把每一步全部代码贴在开头
然后把代码拆分为几步
本人水平极低,这篇文章是借鉴别人然后一点一点啃出来的,可谓寸步难行,可以说大部分东西都是从零开始,很多东西不知道都是拿来就用,边用边学,遇到问题再学,所以如果你什么也看不懂,也不用担心,我可以你也可以的
因为我是懒狗,所以很多思考的细节没有体现出来
各位遇到问题,欢迎交流
1.随机生成数
#define MAX 100000
#define MIN 1000int generate()
{ofstream ofile;//写文件ofile.open("data.txt", ios::out);//创建并打开名为"data.txt"的文件
//生成随机数的操作:clock_t start_time = clock();//计时开始srand(unsigned(time(0)));//生成时间种子int i = 0;for (int i = 0; i < 10000000; ++i) {unsigned long data = rand() % (MAX - MIN + 1) + MIN;//较标准:生成大小为MAX-MIN的随机数ofile << data << endl; //输出数据到data.txt }ofile.close();//关闭文件return 0;
}
1.1.写文件的操作
ofstream ofile;//第一步声明ofile.open("data.txt", ios::out);//第二部创建并打开名为"data.txt"的文件,并以ios::out的方式打开ofile << data << endl; //输出数据到data.txt ofile.close();//关闭文件
1.2.读文件的操作
见后面
1.3.随机生成数的操作
#define MAX 。。。。//自己定义#define MIN 。。。。//自己定义clock_t start_time = clock();//计时开始srand(unsigned(time(0)));//生成时间种子unsigned long data = rand() % (MAX - MIN + 1) + MIN;//较标准:生成大小为MAX-MIN的随机数
2.把data.txt文件分散为500个子文件
int spit(int num)
{ifstream file;// 读文件,大数据来源 file.open("data.txt", ios::in);//读的方式打开data.txtif (!file.is_open())//如果打开失败,返回。。。{cout<<"打开失败";return 0;} ofstream* ofile = new ofstream[num + 1]; // 写入,预处理存储num个小文件,num可以自定义,这里设置500 int i = 0;//批量打开500个文件for (i = 0; i < num; i++){ //to_string()是把数字转换成string类型,"1"+".txt"="1.txt","ha"+"ppy"="happy"string filename = to_string(i) + ".txt"; ofile[i].open(filename, ios::out);}//写文件i = 0;hash<string> str_hash; // 哈希函数,用于记录哈希值std::string strLine;//std::string是一个类,猜测和string strLine一个意思while (getline(file, strLine))// 读入大数据文件每一行 (String strLine){i++;if (strLine.empty())continue;int ton = str_hash(strLine) % num; // 哈希计算分块位置 ,哈希值%numofile[ton] << strLine << endl;//在选中的小文件中写入当前在大文件读到的数据if (i % 10000 == 0){cout << i << endl; // 每写入10000行输出一次,进度说明}}file.close();//关闭文件//批量关闭文件for (i = 0; i <= num; i++){ofile[i].close();//把每个小文件的写都关闭掉}delete[] ofile;//前面new出来的记得delete
}
3.对每一个子文件进行(降序)排序,并将前100的数据分别放到“(top ten)1.txt" "top(top ten)2.txt"......"(top ten)500.txt"文件中
typedef pair<string, int> PAIR;
bool cmp_by_value(const PAIR& lhs, const PAIR& rhs) {return lhs.second > rhs.second;//lhs.second>rhs.second即左大于右,降序//lhs.second<rhs.second就左小于右,升序
}int get100(int num)
{for (int q = 1; q < num; q++)//500是文件数,假设分成了500个文件{ifstream file; // 建立小文件对象 读ofstream ofile; // 建立小文件对象 写string filename = to_string(q) + ".txt"; // 文件来向和去向设定 to_string的作用是把数值改为字符串格式file.open(filename, ios::in);ofile.open("前一百" + filename, ios::out);if (!file.is_open())break;string strLine;//用于读文件map<string, int> hm;//存储key关键字和num频率 <string,int>分别对应数据key和频率numwhile (getline(file, strLine)) {if (strLine.empty())continue;hm[strLine] += 1; //map 统计频率 比如数据"1234"出现了一次,那么就hm["1234"]+=1;}cout << "*****" << endl;vector<PAIR> vec(hm.begin(), hm.end());//这里是把哈希表中的数据放进vector,留意这个PAIR,上面已经定义了sort(vec.begin(), vec.end(), cmp_by_value);//这里是排序算法 头文件要包含#include <algorithm> 排序后的结果是降序的 具体原因看PAIR的定义cout << "***" << endl;int length = 0;vector<PAIR>::iterator it;//vector的迭代器for (it = vec.begin(); it != vec.end(); it++)//it=vec.begin()即指向vec的第一个数据//vec.end()同理 {length++;}int i = 0;while (true) // 输出所有的数据,为什么不是全部前100的数据,因为一个小文件的数据太少了,远达不到100个,这个时候还试图取前一百个例如调用vec[100]就会造成越界 {cout << i << " " << vec[i].first << " " << vec[i].second << endl;ofile << vec[i].first << "," << vec[i].second << endl;//if (i >= 100 && vec[i].second != vec[i + 1].second) // 保证100之后是否存在和100相同的数据 (这是取前100的时候才用的判断)if (i == length - 1)break;i++;}file.close();//文件在最后一定要记得关闭ofile.close();//文件在最后一定要记得关闭}return 0;
}
3.1.打开需要读和写的文件
ifstream file; // 建立小文件对象 读ofstream ofile; // 建立小文件对象 写string filename = to_string(q) + ".txt"; // 文件来向和去向设定 to_string的作用是把数值改为字符串格式file.open(filename, ios::in);ofile.open("前一百" + filename, ios::out);if (!file.is_open())break;
3.2.把子文件的所有数据放入map中,记录数据key和num
string strLine;//用于读文件map<string, int> hm;//存储key关键字和num频率 <string,int>分别对应数据key和频率numwhile (getline(file, strLine)) {if (strLine.empty())continue;hm[strLine] += 1; //map 统计频率 比如数据"1234"出现了一次,那么就hm["1234"]+=1;}
3.3.把map中的数据放入vector中,为排序做准备
vector<PAIR> vec(hm.begin(), hm.end());//这里是把哈希表中的数据放进vector,留意这个PAIR,上面已经定义了
3.4.对vector进行排序
sort(vec.begin(), vec.end(), cmp_by_value);//这里是排序算法 头文件要包含#include <algorithm> 排序后的结果是降序的 具体原因看PAIR的定义
3.5.利用迭代器统计vector的长度
int length = 0;vector<PAIR>::iterator it;//vector的迭代器for (it = vec.begin(); it != vec.end(); it++)//it=vec.begin()即指向vec的第一个数据//vec.end()同理 {length++;}
3.6.把子文件出现频率为前面的数据存入子文件的子文件中
int i = 0;while (true) // 输出所有的数据,为什么不是全部前100的数据,因为一个小文件的数据太少了,远达不到100个,这个时候还试图取前一百个例如调用vec[100]就会造成越界 {cout << i << " " << vec[i].first << " " << vec[i].second << endl;ofile << vec[i].first << "," << vec[i].second << endl;//if (i >= 100 && vec[i].second != vec[i + 1].second) // 保证100之后是否存在和100相同的数据 (这是取前100的时候才用的判断)if (i == length - 1)break;i++;}
3.7.关闭3.1打开的文件
file.close();//文件在最后一定要记得关闭ofile.close();//文件在最后一定要记得关闭
4.把所有“(top ten)1.txt" "top(top ten)2.txt"......"(top ten)500.txt"文件集合到”all.txt"文件中
int getALl(int& num) {ofstream ofile;ofile.open("all.txt", ios::out);for (int q = 0; q < 500; q++) {ifstream file;string filename = "(前一百)" + to_string(q) + ".txt";file.open(filename, ios::in);if (!file.is_open()){cout << "打开失败" << endl;}elsecout << "打开成功" << endl;string strLine;while (getline(file, strLine)){if (strLine.empty())continue;ofile << strLine << endl;num += 1;}file.close();}ofile.close();return 0;
}
5.对“all.txt"文件进行排序,排序后把top100热词输出到“last.txt"文件中
int last(){ifstream file;file.open("all.txt", ios::in);ofstream ofile;ofile.open("last.txt",ios::out);map<string,double> hm;//存储key关键字和num频率string strLine;while (getline(file, strLine)) {if (strLine.empty()){cout << "继续啊" << endl;continue;}char save[20];strcpy_s(save, strLine.c_str());//把读到的数据放到string数组里面char* token = NULL;char* ptr = NULL;token = strtok_s(save, ",", &ptr);char* a = token;//keystring change = a;token = strtok_s(NULL, ",", &ptr);double b = atof(token);//numcout << "key:" << change << "num:" << b << endl;hm[change] += b; // unordered_map 统计频率}vector<YYDS> vec(hm.begin(), hm.end());sort(vec.begin(), vec.end(), cmp_by_value);cout << "***" << endl;int length = 0;vector<YYDS>::iterator it;for (it = vec.begin(); it != vec.end(); it++){cout << it->first << " " << it->second << endl;length++;}int i = 0;while (true) // 输出前一百的数据 {cout << i << " " << vec[i].first << " " << vec[i].second << endl;ofile << vec[i].first << "," << vec[i].second << endl;if (i >= 100 && vec[i].second != vec[i + 1].second)break; // 保证100之后是否存在和100相同的数据 i++;}file.close();ofile.close();
}
5.1.分割字符串
string strLine;
while (getline(file, strLine)) {if (strLine.empty()){cout << "继续啊" << endl;continue;}char save[20];strcpy_s(save, strLine.c_str());//把读到的数据放到string数组里面char* token = NULL;char* ptr = NULL;token = strtok_s(save, ",", &ptr);char* a = token;//keystring change = a;token = strtok_s(NULL, ",", &ptr);double b = atof(token);//numcout << "key:" << change << "num:" << b << endl;hm[change] += b; // unordered_map 统计频率}
all.txt文件的文件如上图所示,左边是数据key,右边是频率num
注意:中间还有","
读文件的时候是一行一行读的,所以我们要分割字符串才可以分别记录key和num
这时候利用strtok_s();这个函数
海量数据,top100热词,手把手教学相关推荐
- 在热词中看舆论,摆脱“黑天鹅”效应
在互联网时代,热词往往反应了一段时间内公众普遍关注的事件.因此,热词计算是舆情系统中的核心模块,针对资讯.评论.弹幕等进行热词统计,可以快速对海量资讯提取核心词汇,帮助用户快速研判舆论舆情.然而海量数 ...
- 盘点2018年度热词:区块链、5G通信热度反超人工智能
一转眼2018年已经快要走到了尽头.这一年来,科技圈内可谓是风云变幻,各类的新名词与新概念层出不穷.其中很多的概念与产品已经悄然涉及到了我们生活中的方方面面.整个2018人们都在目不暇接的迎接新产品. ...
- 通过tinyxml解析百度热词榜单
百度热词榜单 初学TinyXml,盯上了解析百度热词榜单.通过curl获取rss地址上的数据. 由于TinyXml不支持,所以要转换为UTF-8格式,命令为 iconv -f gb2312 -t ut ...
- ecshop 搜索热词推荐_多多搜索自定义关键词推广的基础点:如何选对致命的关键词...
很多商家可能会疑惑我为什么不讲点击率,点击率固然重要,但其实多多搜索是围绕关键词展开的.正所谓万丈高楼平地起,关键词才是多多搜索的基础,没有这个基础,买家都搜不到你,或者搜到了却不是精准人群,点击率也 ...
- “赶上热词热概念,是我们不幸的一面” | 对话小冰公司CEO李笛
金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 小冰的很多进展,往往只能借用科幻电影才能更好解释. <Her>中描绘过一个如影随形的专属AI虚拟人,跟主人公聊天聊地,从诗词歌赋 ...
- ecshop 搜索热词推荐_拼多多搜索推广实操——如何选择正确的关键词实现高投产!...
原标题:拼多多搜索推广实操--如何选择正确的关键词实现高投产! 大家好我是拼多多运营林枫,每天都会更新新的内容哦,没关注的记得关注一下哦! 今天和大家讲讲搜索推广怎么正确选择有效的关键词,很多商家可能 ...
- 关键词词云怎么做_制作CVPR 热词云(并爬取pdf地址 名称)
#!/usr/bin/python #这里是解释器位置和python版本#-*- coding: utf-8 -*- #编码格式 """@author: CuiXingY ...
- Android Wear 唤醒热词会比“你好,安卓”好吗?
随着Motorola 在发布搭载了Android Wear 操作系统的智能手表 Moto 360 二代中国版手表,Android Wear正式进入中国大陆,因为一些原因,其最核心的语音搜索功能破天荒地 ...
- “大数据杀熟”成网络热词,科技公司信任危机到来?
两个人用同一款打车软件去相同的目的地,手机软件显示价格相差30%,这类情况被冠名为"大数据杀熟". 传说中,在"平台大数据库"里被标记为"价格不敏感型 ...
最新文章
- 2017 年最流行的 15 个数据科学 Python 库
- 用NanoPi NEO Air连接USB摄像头
- Java17-day08【File(创建和删除文件、判断和获取功能、遍历目录)、IO流(字节流写数据、异常处理、字节流读数据、复制文本文件、复制图片)】
- Excel图表横坐标设置怎么做?(亲测)
- IE8下submit表单没反应
- ant java eclipse_Eclipse之ANT使用
- mac eclipse 安装lombok_别再写getter,setter方法了,用Lombok来简化你的代码吧
- 软件开发中 前台、中台、后台英文_中台为什么这么火?
- 数学函数图像软件-Graph之小技巧
- CleanMyMac X4.11.1中文正式版 系统优化 垃圾清理 程序卸载工具
- 随机过程(4)——马尔可夫链
- 笔记本指纹识别linux版驱动程序,联想Thinkpad指纹识别驱动
- 【ISO9126】软件质量模型的介绍(软件质量管理的六大特征和二十七个子特征)
- c语言闰月的计算方法,如何计算闰月如何用计算机编程? 爱问知识人
- matlab图无线型,如何使用MATLAB进行移动无线信道模型的建模资料概述
- 罗技鼠标M330拆解
- 智慧交通大数据可视化,让城市运营车辆可视、可监、可控
- BUUCTF-刷题记录-7
- 想哪写哪_随笔20191130
- 聊聊RSNA2017上的机器学习