spark练习题RDD(python)

先提出几个问题

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))

data01
{"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

统计内容:

  1. 统计每一个省份点击TOP3的广告ID
  2. 统计每一个省份每一个小时的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())

data02
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

统计内容:

  1. 用户在基站停留的总时长
  2. 把两个表连接出来
--------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())
data03_a1
18688888888,20160327082400,16030401EAFB68F1E3CDF819735E1C66,1
18611132889,20160327082500,16030401EAFB68F1E3CDF819735E1C66,1
18688888888,20160327170000,16030401EAFB68F1E3CDF819735E1C66,0
18611132889,20160327180000,16030401EAFB68F1E3CDF819735E1C66,0
data03_a2
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())

data04_a1
1001    李正明
1002    王一磊
1003    陈志华
1004    张永丽
1005    赵信
1006    古明远
1007    刘浩明
1008    沈彬
1009    李子琪
1010    王嘉栋
1011    柳梦文
1012    钱多多
data04_a2
1001    大数据基础    90
1002    大数据基础    94
1003    大数据基础    100
1004    大数据基础    99
1005    大数据基础    90
1006    大数据基础    94
1007    大数据基础    100
1008    大数据基础    93
1009    大数据基础    89
1010    大数据基础    78
1011    大数据基础    91
1012    大数据基础    84
data04_a3
1001    应用数学    96
1002    应用数学    94
1003    应用数学    100
1004    应用数学    100
1005    应用数学    94
1006    应用数学    80
1007    应用数学    90
1008    应用数学    94
1009    应用数学    84
1010    应用数学    86
1011    应用数学    79
1012    应用数学    91

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值