这篇博客主要是利用Titanic dataset来简单演示pyspark 1.6.1的使用方法。
这组数据比较小,训练数据只有891行,训练、测试数据可以在这里下载(train.csv, test.csv)。
内容
- 数据加载和转化
- 数据清理
- 特征提取
- 套用ml/mllib算法
1. 数据加载和转化
a. 数据加载
当我们运行pyspark之后,SparkContect (sc)就同时运行了。
我们利用sc.textFile读取csv文件,生成的数据格式为RDD。
与此同时,我们也可以使用sqlContext.read.text读取csv文件,但是生成数据格式为DataFrame。
train_path='/Users/chaoranliu/Desktop/github/kaggle/titanic/train.csv'
test_path='/Users/chaoranliu/Desktop/github/kaggle/titanic/test.csv'
# Load csv file as RDD
train_rdd = sc.textFile(train_path)
test_rdd = sc.textFile(test_path)
让我们看看前3行RDD数据:
train_rdd.take(3)
数据的结构是python list, 每一行是一个string。
[u'PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked',
u'1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S',
u'2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C']
b. 转化RDD为DataFrame
Spark DataFrame 是从R data frame 和 python pandas DataFrame 得到的灵感,它是Spark 新的数据格式,在以后版本会取代RDD。它的语法与RDD不同,会更加接近R和pandas. 这里我会把RDD转化为DataFrame,以便后面的数据处理。
步骤:
- 去掉数据标题(第一行)
- 用逗号分割每行数据 并 转化为tuple
- 用数据标题命名数据列
# Parse RDD to DF
def parseTrain(rdd):
# extract data header (first row)
header = rdd.first()
# remove header
body = rdd.filter(lambda r: r!=header)
def parseRow(row):
# a function to parse each text row into
# data format
# remove double quote, split the text row by comma
row_list = row.replace('"','').split(",")
# convert python list to tuple, which is
# compatible with pyspark data structure
row_tuple = tuple(row_list)
return row_tuple
rdd_parsed = body.map(parseRow)
colnames = header.split(",")
colnames.insert(3,'FirstName')
return rdd_parsed.toDF(colnames)
## Parse Test RDD to DF
def parseTest(rdd):
header = rdd.first()
body = rdd.filter(lambda r: