学习进度 9
DataFrame 其实是带列名的分布式表格,和 MySQL 里的表、Pandas 里的 DataFrame 逻辑差不多,比纯手写 RDD 算子简单太多。比如之前用 RDD 统计文本行数,得写sc.textFile("file.txt").count(),而 DataFrame 可以直接读成表结构,用类 SQL 的语法操作,对新手友好度拉满。
一、创建 DataFrame
从本地文件创建:用spark.read.csv("file:///D:/Spark/data.csv", header=True, inferSchema=True)直接读取 CSV 文件,header=True表示第一行是列名,inferSchema=True能自动推断列的数据类型,不用手动定义,比 RDD 手动解析字段省太多事;
从集合创建:spark.createDataFrame([(1, "张三"), (2, "李四")], ["id", "name"]),适合快速测试小数据;
从 RDD 转换:把之前写的 RDD 通过toDF(["列名1", "列名2"])转成 DataFrame,能无缝衔接之前的代码。
二、核心操作:类 SQL 语法 + DSL 风格
这是今天最直观的收获 ——DataFrame 支持两种操作方式,不用再死记 RDD 的map/filter算子:
SQL 风格:先把 DataFrame 注册成临时视图df.createOrReplaceTempView("user"),然后直接写 SQL 查询spark.sql("select * from user where id > 1"),懂点 SQL 就能上手,完全不用写复杂的 RDD 逻辑;
DSL 风格:直接用 DataFrame 的方法链式调用,比如df.filter(df("id") > 1).select("name"),代码更简洁,不用写 SQL 字符串。
试了个简单案例:读取包含 “姓名、年龄、城市” 的 CSV 文件,统计每个城市的人数,用 DataFrame 几行代码就搞定,换成 RDD 得写map转键值对 +reduceByKey,对比下来 DataFrame 的代码可读性高太多。
三、收获
最大的感受是:DataFrame 把结构化数据处理的门槛降下来了,不用再关注底层 RDD 的分区、依赖这些细节,专注业务逻辑就行。

浙公网安备 33010602011771号