先提出几个问题
1.你觉得拿到一个分析数据任务要干什么?
2.你觉得什么是最恐怖的?
首先,拿到任务第一步肯定不是直接读题,而是看数据,看结构,知道是什么样的数据才知道要怎么处理。
其次,代码报错不可怕,不报错更不可怕,是不报错,还和你想要的结果不是一个东西才可怕。
一、题目一
{“id”:“572692378957430785”,“user”:“Srkian_nishu “,“text”:”@always_nidhi @YouTube no i dnt understand bt i loved the music nd their dance awesome all the song of this mve is rocking”,“place”:“Orissa”,“country”:“India”}
{“id”:“572575252020109313”,“user”:“someone actually”,“text”:“idk why people hate being stuck in traffic if theres no rush to get somewhere like traffic is an excuse to think and listen to music”,“place”:“Vienna”,“country”:“United States”}
{“id”:“572647831053312000”,“user”:“Rinie Syamsuddin”,“text”:“Serasi ade haha @AdeRais “@SMTOWNGLOBAL: #SHINee ONEW(@skehehdanfdldi) and #AMBER(@llama_ajol) at KBS ‘Music Bank’. http://t.co/ZhUKPhk8am””,“place”:“Mario Riawa”,“country”:“Indonesia”}
{“id”:“572647841220337664”,“user”:“Cas”,“text”:"@BeezyDH_ it’s like one of us got locked up… It’s all music now",“place”:“Norwalk”,“country”:“United States”}
统计内容:
1)统计tweets 总条数;
2)统计每个用户的tweets 条数;
3)统计tweets中被@的分别是那些人;
4)统计出被@次数最多的10个人;
提示:该题目需要将json数据转化为相应的对象,用于RDD的计算、
解答:这个题的数据是推特的数据,包括id,用户名,编写文本,位置,和国家,是个字典类型,可以转换成元组处理,但是不推荐, 本题是转为json对象,也可以封装成class对象
import json
import re
from pyspark import SparkConf, SparkContext, StorageLevel
if __name__ == '__main__':
conf = SparkConf().setAppName("job3").setMaster("local[*]")
context = SparkContext(conf=conf)
#读取文件会自动按照回车分割
txt = context.textFile('./data01.txt');#读取文件
#主要进行json操作
#可以定义类去写
#class node:
# def __init__(self):
# id()
def m(value):
object = json.loads(value)#可直接把value直接转换成json对象
#处理json对象方法
#1.将json封装成一个对象class
#2.直接使用json对象(本题)
#3.json转化为一个元组(有点费劲)
#t = (object["id"], object["user"], object["text"])
#print(object['id'])
return object;
rdd = txt.map(m)
#print(txt.collect())#json字符串
#print(rdd.collect())#输出json数据
# 1、统计tweets总条数
print("总条数为:", rdd.count())
# 2、统计每个用户的tweets条数===一共有多少用户 map是为了把里面的 resultierable对象拿出来
rdd1 = rdd.groupBy(lambda x:x["id"]).map(lambda x:(x[0],len(list(x[1]))))#list转换成列表,len大小,不用list也可以
print(rdd1.collect())
# 一共有多少用户
rdd2 = rdd.groupBy(lambda x:x["id"]).distinct().count();
print("总人数为:", rdd2)
# 3、统计tweets中别被@的分别是哪些人 正则表达式
regex = "@\w+"
rdd3 = rdd.map(lambda x:x["text"]).flatMap(lambda x:re.findall(regex, x))#flatmap会将嵌套展开
print(rdd3.distinct().collect())#distinct去重
# 4、统计出被@次数最多的10个人\\排序
rdd4 = rdd3.map(lambda x:(x, 1)).reduceByKey(lambda x,y:x+y).sortBy(lambda x:x[1], False) # 从大到小
print(rdd4.take(10))
{"id":"572692378957430785","user":"Srkian_nishu ","text":"@always_nidhi @YouTube no i dnt understand bt i loved the music nd their dance awesome all the song of this mve is rocking","place":"Orissa","country":"India"} {"id":"572692378957430785","user":"Srkian_nishu ","text":"@always_nidhi @YouTube no i dnt understand bt i loved the music nd their dance awesome all the song of this mve is rocking","place":"Orissa","country":"India"} {"id":"572692378957430785","user":"Srkian_nishu ","text":"@always_nidhi @YouTube no i dnt understand bt i loved the music nd their dance awesome all the song of this mve is rocking","place":"Orissa","country":"India"} {"id":"572692378957430785","user":"Srkian_nishu ","text":"@always_nidhi @YouTube no i dnt understand bt i loved the music nd their dance awesome all the song of this mve is rocking","place":"Orissa","country":"India"} {"id":"572575252020109313","user":"someone actually","text":"idk why people hate being stuck in traffic if theres no rush to get somewhere like traffic is an excuse to think and listen to music","place":"Vienna","country":"United States"} {"id":"572647831053312000","user":"Rinie Syamsuddin","text":"Serasi ade haha @AdeRais @SMTOWNGLOBAL: #SHINee ONEW(@skehehdanfdldi) and #AMBER(@llama_ajol) at KBS ‘Music Bank’. http://t.co/ZhUKPhk8am","place":"Mario Riawa","country":"Indonesia"} {"id":"572647841220337664","user":"Cas","text":"@BeezyDH_ it’s like one of us got locked up… It’s all music now","place":"Norwalk","country":"United States"} {"id":"572647841220337664","user":"Cas","text":"@BeezyDH_ it’s like one of us got locked up… It’s all music now","place":"Norwalk","country":"United States"} |
二、题目二
数据:
1562085629599 Hebei Shijiazhuang 564 1
1562085629621 Hunan Changsha 14 6
1562085629636 Hebei Zhangjiakou 265 9
1562085629653 Hunan Changsha 985 4
1562085629677 Jiangsu Nanjing 560 6
1562085629683 Hubei Jingzhou 274 2
统计内容:
- 统计每一个省份点击TOP3的广告ID
- 统计每一个省份每一个小时的TOP3广告ID
提示:数据格式:timestamp、province、city、userid、adid
------2
import math
from pyspark import SparkConf, SparkContext, StorageLevel
#哪个时间,哪个地点,哪个用户,点了哪个广告
if __name__ == '__main__':
conf = SparkConf().setAppName("job3").setMaster("local[*]")
context = SparkContext(conf=conf)
class ClickADD:
def __init__(self,timestamp,province,city,userid,adid):
self.timestap = timestamp
self.province = province
self.city = city
self.userid = userid
self.adid = adid
txt = context.textFile("./data02.txt");
def doData(x):
li = x.split(" ")
#return json.dumps(ClickADD(li[0],li[1],li[2],li[3],li[4]))
#return li
return {"timestamp":li[0],"province":li[1],"city":li[2],"userid":li[3],"adid":li[4],}
#data = txt.map(lambda x:x.split(" "))#空格分割
#print(txt.collect())
data = txt.map(doData)
#print(data.collect())
# 1、统计每一个省份点击TOP3的广告ID
data1 = data.map(lambda x:(x["province"],x["adid"]))
print(data1.collect())
#按照省份聚合
data2 = data1.groupByKey().map(lambda x:(x[0],list(x[1])))#groupbukey 将相同的key放在一起
print(data2.collect())
#2、统计每一个省份每一个小时的TOP3广告ID
data3 = data.map(lambda x:((math.floor(int(x['timestamp'])/1000/60/60),x['province']),x['adid']))
data4 = data3.groupByKey().map(lambda x:(x[0],list(x[1])))
#可以直接除运算,timestamp单位是毫秒,/1000/60/60,math.floor向下取整
print(data4.collect())
1562085629599 Hebei Shijiazhuang 564 1 1562085629621 Hunan Changsha 14 6 1562085629636 Hebei Zhangjiakou 265 9 1562085629653 Hunan Changsha 985 4 1562085629677 Jiangsu Nanjing 560 6 1562085629683 Hubei Jingzhou 274 2 1562085629683 Hubei Jingzhou 274 2 1562085629683 Hubei Jingzhou 274 2 1562085629683 Hubei Jingzhou 274 2 1562085629683 Hubei Jingzhou 274 2 |
三、题目三
表一:
手机号,时间戳,基站名字,1代表进站,0代表出站
18688888888,20160327082400,16030401EAFB68F1E3CDF819735E1C66,1
18611132889,20160327082500,16030401EAFB68F1E3CDF819735E1C66,1
18688888888,20160327170000,16030401EAFB68F1E3CDF819735E1C66,0
18611132889,20160327180000,16030401EAFB68F1E3CDF819735E1C66,0
表二:
基站名字,经度,纬度
9F36407EAD0629FC166F14DDE7970F68,116.304864,40.050645,6
CC0710CC94ECC657A8561DE549D940E0,116.303955,40.041935,6
16030401EAFB68F1E3CDF819735E1C66,116.296302,40.032296,6
统计内容:
- 用户在基站停留的总时长
- 把两个表连接出来
--------3
import math
from pyspark import SparkConf, SparkContext, StorageLevel
if __name__ == '__main__':
conf = SparkConf().setAppName("job3").setMaster("local[*]")
context = SparkContext(conf=conf)
txt = context.textFile("./data03_a1.txt").map(lambda x:x.split(",")) #先处理数据
#print(txt.collect())
#用户在基站停留总时长,用户手机号一样,基站名一样,出站时间减去入站时间
#1.将用户和基站作为key
#2.值是(进站/出站,时间戳)
#data = txt.map(lambda x:((x[0],x[2]),{x[3]:x[1]}))
# def time(a,b):
# #print(a,b)
# return int(b['0'])-int(a['1'])
# data2 = data.reduceByKey(time)
# print(data2.collect())
data3 = txt.map(lambda x: ((x[0], x[2]), int(x[1])))
data4 = data3.reduceByKey(lambda a,b:math.fabs(a-b))#fabs给我变成正数
print(data4.collect())
#2.把两个表连接===join(两个表有关联=基站名字)
#join只能用在键值对的情况下,按相同的key分组
txt1 = context.textFile("./data03_a2.txt").map(lambda x:x.split(","))
txt = txt.map(lambda x:(x[2],(x[0],x[1],x[3])))
txt2 = txt1.map(lambda x:(x[0],(x[1],x[2],x[3])))
# print(txt.collect())
# print(txt2.collect())
j = txt.join(txt2)
print(j.collect())
18688888888,20160327082400,16030401EAFB68F1E3CDF819735E1C66,1 18611132889,20160327082500,16030401EAFB68F1E3CDF819735E1C66,1 18688888888,20160327170000,16030401EAFB68F1E3CDF819735E1C66,0 18611132889,20160327180000,16030401EAFB68F1E3CDF819735E1C66,0 |
9F36407EAD0629FC166F14DDE7970F68,116.304864,40.050645,6 CC0710CC94ECC657A8561DE549D940E0,116.303955,40.041935,6 16030401EAFB68F1E3CDF819735E1C66,116.296302,40.032296,6 |
四、题目四
表1:
1001 李正明
1002 王一磊
1003 陈志华
1004 张永丽
1005 赵信
1006 古明远
1007 刘浩明
1008 沈彬
1009 李子琪
1010 王嘉栋
1011 柳梦文
1012 钱多多
表2:
学号 课程 分数
1001 大数据基础 90
1002 大数据基础 94
1003 大数据基础 100
1004 大数据基础 99
1005 大数据基础 90
1006 大数据基础 94
1007 大数据基础 100
1008 大数据基础 93
1009 大数据基础 89
1010 大数据基础 78
1011 大数据基础 91
1012 大数据基础 84+
表三:
1001 应用数学 96
1002 应用数学 94
1003 应用数学 100
1004 应用数学 100
1005 应用数学 94
1006 应用数学 80
1007 应用数学 90
1008 应用数学 94
1009 应用数学 84
1010 应用数学 86
1011 应用数学 79
1012 应用数学 91
统计:
1.计算每个学生这两门课程的总成绩,并且排序输出前5名
2.找出单科成绩为100的学生ID,最终的结果需要集合到一个RDD中
3.求每个学生这两门成绩的平均值
4.合并这个三个表,汇总学生成绩并以文本格式存储,数据汇总为学生ID,姓名,大数据成绩,数学成绩,总分,平均分。比如 1002,王一磊,94,94,188,94.0
-------4
from pyspark import SparkConf, SparkContext, StorageLevel
if __name__ == '__main__':
conf = SparkConf().setAppName("job3").setMaster("local[*]")
context = SparkContext(conf=conf)
student = context.textFile("./data04_a1.txt").map(lambda x: tuple(x.split("\t")))#map(lambda x:(x[0],x[1]))
#print(student.collect())
bigdata = context.textFile("./data04_a2.txt").map(lambda x: tuple(x.split("\t")))
#print(bigdata.collect())
m = context.textFile("./data04_a3.txt").map(lambda x: tuple(x.split("\t")))
#print(m.collect())
# 1.计算每个学生这两门课程的总成绩,并且排序输出前5名
bigdata1 = bigdata.map(lambda x:(x[0],(x[1],int(x[2]))))
m1 = m.map(lambda x: (x[0], (x[1], int(x[2]))))
score = bigdata1.join(m1)
#score = score.map(lambda x:(x[0],x[1][0][1]+x[1][1][1])).sortBy(lambda x:x[1],False).take(5)
#print(score)
# 2.找出单科成绩为100的学生ID,最终的结果需要集合到一个RDD中
#print(score.collect())
#score = score.map(lambda x:(x[0],x[1][0][1]+x[1][1][1])).sortBy(lambda x:x[1],False).print(score)
#(2)单科筛选到一起filter(过滤器,TRUE保留)
# def c(x):
# if(x[1][1] == 100):
# return True
# else
# return False
bigfilter = bigdata1.filter(lambda x:True if x[1][1] == 100 else False)
print(bigfilter.collect())
mfilter = m1.filter(lambda x:True if x[1][1] == 100 else False)
print(mfilter.collect())
rdd = bigfilter.union(mfilter).groupByKey().map(lambda x:(x[0],list(x[1])))
print(rdd.collect())
# 3.求每个学生这两门成绩的平均值
score1 = score.map(lambda x:(x[0],int(x[1][0][1]+x[1][1][1])/2))
print(score1.collect())
# 4.合并这个三个表
data5 = student.map(lambda x: ((x[0], x[1])))
result1 = data5.join(bigdata1)
result2 = result1.join(m1)
result3 = result2.join(score1)
# result4 = result3.map(lambda x: (x[0], x[1][0][0][0][0], x[1][0][0][0][1], x[1][0][0][1], x[1][0][1], x[1][1]))
result4 = result3.map(lambda x: (x[0], x[1][0][0][0], x[1][0][0][1][1], x[1][0][1][1], x[1][1]))
print(result3.collect())
print(result4.collect())
1001 李正明 1002 王一磊 1003 陈志华 1004 张永丽 1005 赵信 1006 古明远 1007 刘浩明 1008 沈彬 1009 李子琪 1010 王嘉栋 1011 柳梦文 1012 钱多多 |
1001 大数据基础 90 1002 大数据基础 94 1003 大数据基础 100 1004 大数据基础 99 1005 大数据基础 90 1006 大数据基础 94 1007 大数据基础 100 1008 大数据基础 93 1009 大数据基础 89 1010 大数据基础 78 1011 大数据基础 91 1012 大数据基础 84 |
1001 应用数学 96 1002 应用数学 94 1003 应用数学 100 1004 应用数学 100 1005 应用数学 94 1006 应用数学 80 1007 应用数学 90 1008 应用数学 94 1009 应用数学 84 1010 应用数学 86 1011 应用数学 79 1012 应用数学 91 |