1.数据下载与理解
- 淘宝用户购物行为数据集https://tianchi.aliyun.com/dataset/649
- 完整数据文件UserBehavior.csv,3.42G
- 小测试文件 UserBehaviorSmall.csv 18M
- 小测试文件用于测试与练习,最后提交的计算用完整的数据文件。
- 数据集包含了约一亿条随机用户的所有行为。数据集的每一行表示一条用户行为:用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。
- 行为类型:点击pv、购买buy、加购cart、fav收藏
2.数据预处理:
- 原始文件时间戳数据转换为datetime类型,能按日期和时间进行查找。
import numpy as np
import pandas as pd
import matplotlib as mpl
from matplotlib import pyplot as plt
import seaborn as sns
import warnings
import matplotlib.dates as mdates
from datetime import timedelta
warnings.filterwarnings('ignore')
mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"]=False
import datetime
import time
读文件
df=pd.read_csv(r"D:\virtual\sharefile\UserBehavior.csv",header=None,names=['userId','goodsId','goodsTypeID','behaviorType','timeStamp'])
转换时间格式
df['timeStamp']=pd.to_datetime(df['timeStamp'],unit='s')
df['date']=df['timeStamp'].dt.date
df['hour']=df['timeStamp'].dt.time
删除timeStamp列
df=df.drop('timeStamp',axis=1)
截取2017.11.25到2017.12.3时间的数据
temp=df['date']=df['date'][(df['date']>=datetime.date(2017,11,25))(df['date']<=datetime.date(2017,12,3))]
- 删除不正常数据(例如日期不是2017年的)
检查是否存在缺失数据。
检查是否存在重复数据并去重
检查时间戳列中是否存在异常数据,获取并删除所有异常数据
删除date数据为nan的
df = df.dropna(axis=0, how='any')
保存
temp.to_csv('./UserBehaviorSample.csv')
- 字段解析
- 生成RDD
rdd=sc.textFile(r'D:\virtual\sharefile\UserBehaviorSample.csv').map(lambda line:line.split(',')).map(lambda line:[int(line[0]),int(line[1]),int(line[2]),line[3],line[4],int(line[5])])
- 生成DataFrame
df=rdd.toDF(['user_id','product_id','category_id','action','date','hour'])
- 生成SQL临时表
3.用Spark RDD操作、Spark SQL DataFrame操作和SQL语句三种方法完成以下数据分析。
示例: 问题1):Tom选修的科目和考分 (1)RDD操作:spark.sql('select * from scs where name== "Tom" ') (2)DF操作:df.where('name=="Tom"') (3)SQL语句:spark.sql('select * from scs where name== "Tom" ') |
1)数据整体概况:数据集中有多少条记录,有多少个用户,有多少件商品,有多少个商品类别,记录了多少个日期的数据。
(1)RDD操作:
数据集中有多少条记录
rdd.count()
有多少个用户
rdd.map(lambda x: x[0]).distinct().count()
有多少件商品
rdd.map(lambda x: x[1]).distinct().count()
有多少个商品类别
rdd.map(lambda x: x[2]).distinct().count()
记录了多少个日期的数据。
rdd.map(lambda x: x[4]).distinct().count()