1. RDD内部运行方式
(1) RDD并行操作
1)RDD每个转换并行执行
2)数据集转换惰性,即任何转换仅在调用数据集上的操作时才执行。
eg: 数据分析案例
a. 统计出某一列中不同值出现的次数
b. 选出以字母A开头的。
c. 将结果打印在屏幕上
常见可能 串行执行以上步骤。Spark仅仅统计以A开头的项。并将结果但因在屏幕上。
2. 创建RDD
(1) 两种方法
1) .parallelize(…) (list或array)
2) 读取本地或外部的文件
data_from_file = sc.textFile(’/User/drabast/Documents/PySpark_Data/VS14MORT.txt.gz’
,4) , 4表示分区个数
3)支持数据格式: 文本,parquet, JSON, Hive 或者JDBC驱动程序读取关系数据库。
4)Spark可自动处理压缩数据集
(2) RDD有时需要转换为DataFram:
1)当RDD进行类似表的相应操作时,都需要指定相应的函数,转换为DataFrame书写更简单,并且执行效率高。
2)并不是所有RDD都可以转换为DataFrame, 只有相似格式的RDD才可以转换为DataFrame
3)转换:
sqlContext.createDataFrame(data, schema=None, samplingRatio=None, verifySchema=True)
来将RDD转换为DataFrame,其中的参数设置需要注意:
schema:DataFrame各列类型信息,在提前知道RDD所有类型信息时设定。例如
schema = StructType([StructField(‘col1’, StringType()), StructField(‘col2’, IntegerType())])
samplingRatio:推测各列类型信息的采样比例,在未知RDD所有类型信息时,spark需要根据一定的数据量进行类型推测;
模认情况下,spark会抽取前100的RDD进行推测,之后在真正将RDD转换为DataFrame时如果遇到类型信息不符会报错
同理采样比例较低,推测类型信息也可能错误。
(3) DataFrame 转换为RDD
1)有时候DataFrame的表相关操作不能处理一些问题,例如需要对一些数据利用指定的函数进行计算时,就需要将DataFrame转换为RDD
2)转换方法:
>>> lists = [['a', 1], ['b', 2]]
>>> list_dataframe = sqlContext.createDataFrame(lists,['col1','col2'])
>>> list_dataframe.show()
+----+----+
|col1|col2|
+----+----+
| a| 1|
| b| 2|
+----+----+
>>> rdd=list_dataframe.rdd
>>> rdd.collect()
[Row(col1=u'a', col2=1), Row(col1=u'b', col2=2)]
>>> rdd.map(lambda x: [x[0], x[1:]]).collect()
[[u'a', (1,)], [u'b', (2,)]]
>>> rdd.map(lambda x: [x[0], x[1]]).collect()
[[u'a', 1], [u'b', 2]]
3. Schema
(1)RDD是无schema的数据结构
4. 转换
RDD转换包括映射,筛选,连接,转换数据集中的值
(1) .map(…)
(2)
*