spark教程(11)-RDD-DF-DS 汇总 Spark中RDD、DataFrame和DataSet的区别

功课复习:阅读此文之前,请先阅读我的博客 博客1博客2

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的区别

猜你喜欢

转载自www.cnblogs.com/yanshw/p/11698425.html