Spark学习(一)基础数据预处理

来源:互联网 发布:java支付宝开发流程 编辑:程序博客网 时间:2024/05/15 00:50

本文写在进行spark学习的过程中,学习过程主要参考
http://blog.csdn.net/u013719780/article/details/51768720

1、导包

from pyspark import SparkContext

2、提交脚本

 spark-submit pythonapp.py

3、导入数据

user_data = sc.textFile('/路径/ml-100k/u.user')

4、查看某数据集的某一条数据

movie_data.first()

tip1:把map()理解为要对每一行做这个事情,对每个元素做动作

tip2:lambda x:f(x) x就是那个object,f(x)是要对object做的事

tip3:count() 可以看成对整个大局的操作

各类算子

1、map():对每行,用map()中的函数作用
2、filter():对每一个元素,括号里给出筛选条件,进行过滤

1、count():计数、加和
2、distinct():取所有不同的元素,类似于做set()操作,去重
3、collect():把分散的内容整理成一个数组,例如,形成一个由每行中的“年龄”组成的数组

典型问题分析

1、统计某一职业的人数

count_by_occupation = user_fields.map(lambda fields: (fields[3],1)).reduceByKey(lambda x,y:x+y).collect()

分析:典型问题,统计某一属性的个数
1、首先,将属性作为key,将1作为值
2、根据Key进行Reduce,在Reduce中,写入需要进行Reduce的操作。这个操作可以看成将一个大局问题拆成两两的问题。两两是怎样一个问题。
3、最后的collect是为了将一个分散的统计变成一个数组
4、它有一个简化版本

count_by_occupation2 = user_fields.map(lambda fields: fields[3]).countByValue()

其他

1、格式化

print "Users: %d, genders: %d, occupations: %d, ZIP codes: %d"%(num_users,num_genders,num_occupations,num_zipcodes)

2、操作之前先把它变成字段

movie_fields = movie_data.map(lambda lines:lines.split('|'))

3、map可以这样链式级联

years = movie_fields.map(lambda fields: fields[2]).map(lambda x: convert_year(x))

4、得到object的key和value

values = movie_ages.values()bins = movie_ages.keys()

5、对map后取出来的字段做统计操作

ratings.stats()

6、计算每个用户的评价次数

user_ratings_grouped = rating_data.map(lambda fields:(int(fields[0]),int(fields[2]))).groupByKey()user_rating_byuser = user_ratings_grouped.map(lambda (k,v):(k,len(v)))user_rating_byuser.take(5)

绘制每个用户的总共评价次数的分布图:

user_ratings_byuser_local = user_rating_byuser.map(lambda (k,v):v).collect()

这里如果用countByValue的话不能得到是哪个用户进行了评价的相关信息。

7、对异常值或缺失值的处理

现实中的数据会存在信息不规整、数据点缺失和异常值问题。值缺失和异常也很常见。大致的处理方法如下。

1、 过滤掉或删除非规整或有值缺失的数据:这通常是必须的,但的确会损失这些数据里那些好的信息。
2、 填充非规整或缺失的数据:可以根据其他的数据来填充非规整或缺失的数据。方法包括用零值、全局期望或中值来填充,或是根据相邻或类似的数据点来做插值(通常针对时序数据)等。选择正确的方式并不容易,它会因数据、应用场景和个人经验而不同。
3、 对异常值做鲁棒处理:异常值的主要问题在于即使它们是极值也不一定就是错的。到底是对是错通常很难分辨。异常值可被移除或是填充,但的确存在某些统计技术(如鲁棒回归)可用于处理异常值或是极值。
4、 对可能的异常值进行转换:另一种处理异常值或极值的方法是进行转换。对那些可能存在异常值或值域覆盖过大的特征,利用如对数或高斯核对其转换。这类转换有助于降低变量存在的值跳跃的影响,并将非线性关系变为线性的。

用指定值替换bad values和missing values

years_pre_processed = movie_fields.map(lambda fields: fields[2]).map(lambda x: convert_year(x)).collect()
years_pre_processed_array = np.array(years_pre_processed)mean_year = np.mean(years_pre_processed_array[years_pre_processed_array!=1900])median_year = np.median(years_pre_processed_array[years_pre_processed_array!=1900])index_bad_data = np.where(years_pre_processed_array==1900)years_pre_processed_array[index_bad_data] = median_yearprint 'Mean year of release: %d' % mean_yearprint 'Median year of release: %d ' % median_yearprint "Index of '1900' after assigning median: %s"% np.where(years_pre_processed_array==1900)[0]
原创粉丝点击