rdd、dataFrame、dataSet 相当于 spark 中三种数据类型,我这里只总结几点:
1. rdd 是 df、ds 的底层实现
2. df 在 rdd 的基础上添加了结构,可以像数据表一个进行字段操作,易用,且高效
3. df 在 df 的基础上添加了对象概念,可以像操作类一样进行属性操作,目前 python 不支持
4. 三者可互相转换
5. df、ds 是 sparkSQL 中的数据类型,准确的说叫数据抽象,在 sparkSQL 中他们被转换成 table,进行 sql 操作
6. 三者的计算逻辑并无差异,也就是说相同的数据,结果是相同的
7. 三者的计算效率和执行方式不同
8. 在未来 spark 演进过程中, ds 会逐步取代 df、rdd
RDD - DF 互转
dataFrame 类似于数据表,数据表有行的概念,df 也有 Row 的概念,也就是说 df 必须是有行有列,二维的概念;
如果 RDD 不是二维,或者说没有 Row 的概念,先 添加 Row;
RDD 的创建 参考 我的博客 RDD 认知
DF 的创建 参考 我的博客 sparkSQL
RDD to DF 之 toDF
## 手动构建 Row 的概念 rdd1 = sc.parallelize(range(5)) df1_1 = rdd1.map(lambda x: Row(id = x)).toDF() # 先加入结构,即字段,或者说 key,然后调用 toDF # >>> df1 # DataFrame[id: bigint]
RDD to DF 之 spark.createDataFrame
有多种不同的方法,官网上还有其他方法,见 参考资料 1
### 方法2 rdd1 = sc.parallelize([range(5)]) # 注意必须是 二维 的,sc.parallelize(range(5)) 是不行的 df2_1 = spark.createDataFrame(rdd1).collect() # 没有显示地添加字段,以 默认值为 字段名 # [Row(_1=0, _2=1, _3=2, _4=3, _5=4)] rdd2 = sc.parallelize([('a', 1), ('b', 2)]) # 二维数据 df2_2 = spark.createDataFrame(rdd2, ['label', 'num']).collect() # 显示地添加字段 # [Row(label=u'a', num=1), Row(label=u'b', num=2)] ### 方法3 rdd3 = sc.parallelize([('zhangsan', 20), ('lisi', 30)]) Person = Row('name', 'age') # 格式化 Row,每行代表一个 Person person = rdd3.map(lambda x: Person(*x)) # 把 RDD 格式化成 新的 RDD,并加入 Row 的概念 df3_1 = spark.createDataFrame(person).show() # +--------+---+ # | name|age| # +--------+---+ # |zhangsan| 20| # | lisi| 30| # +--------+---+ ### 方法4 from pyspark.sql.types import StructType, StructField, StringType, IntegerType schema = StructType([StructField("name", StringType(), True), StructField("age", IntegerType(), True)]) df3 = spark.createDataFrame(rdd3, schema).collect() # [Row(name=u'zhangsan', age=20), Row(name=u'lisi', age=30)]
DF to RDD
只需调用 rdd 属性即可
rdd = sc.parallelize([('a', 1), ('b', 2)]) # 二维数据 df = spark.createDataFrame(rdd2, ['label', 'num']) df.rdd.collect() # [Row(label=u'a', num=1), Row(label=u'b', num=2)]
参考资料:
https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.SQLContext 官网 rdd to df
https://www.cnblogs.com/lestatzhang/p/10611320.html Spark中RDD、DataFrame和DataSet的区别