RDD API
rdd的获取途径:
(1)利用sc.textFile()从本地文件系统或者hdfs文件系统获得
(2)通过已存在的rdd 进行转换,如map运算
(3)将已有的集合,通过调用sparkcontex的parallelize实现
rdd_test.map(lambda x:(x[1],1)).reduceByKey(lambda x,y:x+y).collect()
使用RDD API进行数据统计,主要是使用map配合reduceByKey。RDD的数据类型只有数据,没有定义Schema。也就是说rdd没有定义字段名,所以只能使用位置来指定某一个字段。如上面代码中的x[1],上面代码的意思是统计x[1]字段每个值的数量。
在得到rdd后,可以用take查看一下数据的格式,以逗号还是空格分隔,是否字段用双引号进行括起来,然后再进行下一步的处理。
若字段用双引号括起来,可以用下面的语句去除双引号,"""表示转义字符,即表示双引号
rdd_test=raw_rdd_test.map(lambda x:x.replace("\"",""))
若字段之间以空格分隔,则用下面的语句进行处理,"\t"表示空格
lines=rdd_test.map(lambda x:x.split("\t"))
DataFrame API
DataFrame是一种分布式数据集合,每一条数据都由几个命名字段组成。spark DataFrame 被创建时必须定义schema,定义每一个字段名和数据类型,因而可以用字段名进行统计
rdd_test.select("gender").groupby("gender").count().show()
创建DataFrame:
现在看的这本书,讲的是在rdd的基础上创建sqlcontex,再创建dataframe。之前看到的一本书好像讲过直接用一个函数读取文件,这个文件就被转换为dataframe的形式了。
这里就先记录现在这本书的方法吧,以后再看到别的方法再补充
#创建sqlContex
sqlContext=SparkSession.builder.getOrCreate()
#定义schema
from pyspark.sql import Row
row_test=rdd_test.map(lambda p:
Row(
id=int(p[0])
age=int(p[1])
gender=p[2]
))
#创建DataFrame
rdd_df=sqlContex.createDataFrame(row_test)
Spark SQL
Spark SQL是由DataFrame派生出来的,必须先创建DataFrame,然后通过登陆Spark SQL temp table就可以使用Spark SQL语句了,就是直接使用SQL语句
sqlcontex.spl("""
select gender ,count(*) counts
from user_table
GROUP BY gender """).show()