Spark DataFrame 是 2015 年 3 月 13 日发布的 Spark 1.3.0 版本中新引入的,也是该版本最大的亮点,从属于 Spark SQL 模块。DataFrame 主要用于进行结构化数据的处理,它提供的一种基于 RDD 之上的全新概念,但是它的底层其实还是基于 RDD 的。
创建 DataFrame
DataFrame 的数据来源可以多种多样,可以通过手写数据,也可以从 csv、json 等文件加载,还可以从 mysql、hive 等存储数据表导入数据。
手写数据初始化 DataFrame
通过 createDataFrame 函数加载数据,示例如下:
from pyspark.sql import SparkSession
spark_session = SparkSession.builder.appName('knowledgedict-dataframe').getOrCreate()
df = spark_session.createDataFrame(
schema=['impression', 'click', 'ctr'],
data=[(100, 5, 0.05), (10, 3, 0.3)]
)
print(df)
df.show()
函数列表
DataFrame 操作可以分为两种类型:Transformation 操作 和 Action 操作。
Transformation 操作:即转换操作,实际上是在构建一个执行计划(DAG,Directed Acyclic Graph),而不会对原始 DataFrame 进行实际修改。
Action 操作:实际动作操作,对 DataFrame 执行实际的计算或操作,通常会触发计算并返回结果,这些操作会导致 Spark 集群上的任务执行,因此它们通常会引起计算开销。
Transformation 操作类函数
| 函数 | 描述 | 版本 |
|---|---|---|
| agg() | 对分组后的数据进行聚合计算,如求和、平均值等。 | 从 1.3 版本支持 |
| coalesce() | 减少分区数,合并分区。 | 从 1.4 版本支持 |
| createTempView() | 创建临时表或视图。 | 从 2.0 版本支持 |
| distinct() | 去除重复的行。 | 从 1.3 版本支持 |
| drop() | 删除指定的列。 | 从 1.4 版本支持 |
| filter() | 根据指定的条件进行过滤。 | 从 1.3 版本支持 |
| fillna() | 填充 null 值,可指定列,也可以全量替换,比较灵活。 | 从 1.3.1 版本支持 |
| groupBy() | 按指定列进行分组。 | 从 1.3 版本支持 |
| join() | 连接两个 DataFrame。 | 从 1.3 版本支持 |
| limit() | 限制返回的行数。 | 从 1.3 版本支持 |
| registerTempTable() | 将 DataFrame 注册为一个 SQL 临时表,以供 SQL 查询使用。 | 从 1.3 版本支持 |
| repartition() | 重新分区 DataFrame,并进行指定分区个数。 | 从 1.3 版本支持 |
| rollup() | 执行多级数据透视操作。 | 从 1.4 版本支持 |
| select() | 选择 DataFrame 中的指定列。 | 从 1.3 版本支持 |
| sample() | 从 DataFrame 中抽样数据。 | 从 1.3 版本支持 |
| toDF() | 用于为DataFrame的列指定名称。 | |
| toJSON() | 将数据转换成 JSON 格式。 | 从 1.3 版本支持 |
| union() | 合并两个 DataFrame。 | 从 2.0 版本支持 |
| where() | filter 函数的别名,等同 filter。 | 从 1.3 版本支持 |
| withColumn() | 添加一个新列或替换现有列。 | 从 1.3 版本支持 |
Action 操作类函数
| 函数 | 描述 | 版本 |
|---|---|---|
| collect() | 在驱动节点收集全部数据并在本地可进行后续操作处理。 | 从 1.3 版本支持 |
| count() | 返回 DataFrame 中的行数。 | 从 1.3 版本支持 |
| explain() | 显示 DataFrame 的物理执行计划。 | 从 1.3 版本支持 |
| first() | 返回 DataFrame 的第一行数据。 | 从 1.3 版本支持 |
| foreach() | 对 DataFrame 中的每一行执行指定的操作。 | 从 1.3 版本支持 |
| foreachPartition() | 对 DataFrame 的每个分区执行指定的操作。 | 从 1.3 版本支持 |
| printSchema() | 用于在控制台或日志中打印 DataFrame 的模式信息。 | 从 1.3 版本支持 |
| show() | 显示 DataFrame 中的数据。 | 从 1.3 版本支持 |
| take() | 返回 DataFrame 的前几行数据。 | 从 1.3 版本支持 |
| toPandas() | 将 DataFrame 转换为 Pandas DataFrame。 | 从 1.3 版本支持 |
两者都可的操作函数
| 函数 | 描述 | 版本 |
|---|---|---|
| cache() | 将 DataFrame 的数据持久化到内存,Transformation 或 Action 操作,具体取决于它的使用方式。 | 从 1.3 版本支持 |