Spark 中创建 DataFrame 的2种方式对比

spark.createDataFrame(data).toDF("name", "age")

spark.createDataFrame(spark.sparkContext.parallelize(data), schema)

创建df的方式有什么区别?

在 Spark 中,创建 DataFrame 的方式有多种,其中两种常见的方式是:

  1. spark.createDataFrame(data).toDF("name", "age")

  2. spark.createDataFrame(spark.sparkContext.parallelize(data), schema)

这两种方式的主要区别在于 数据来源 和 模式(Schema)的定义方式。下面详细分析它们的区别和适用场景。


1. spark.createDataFrame(data).toDF("name", "age")

特点
  • 数据来源data 是一个本地集合(如 Seq 或 List),Spark 会将其并行化为分布式数据集(RDD)。

  • 模式推断:Spark 会自动推断数据的模式(Schema),并根据列的顺序为列命名。

  • 列名指定:通过 toDF("name", "age") 显式指定列名。

### Spark SQL 与 DataFrame 的关系及使用方法 #### 关系分析 Spark SQL 是 Apache Spark 中的一个模块,用于处理结构化数据。它提供了一个编程抽象称为 DataFrame,并作为分布式 SQL 查询引擎的作用[^1]。DataFrame 是一种以表格形式存储的数据结构,类似于传统数据库中的表或者 Pandas 中的 DataFrame。然而,Spark DataFrame分布式的,能够在大规模集群上进行高效的并行计算。 Spark SQL 提供了两种主要的方式来操作数据:一是通过 DataFrame API 进行编程式操作;二是通过标准的 SQL 查询语言来进行声明式操作[^2]。这两种方式最终都会被 Catalyst 优化器编译成底层的 RDD 操作,从而保证性能最优。 --- #### 使用方法对比 ##### 1. **DataFrame API** 通过 DataFrame API 可以编写更加灵活和强大的代码逻辑。以下是其特点: - 支持链式调用,便于构建复杂的 ETL 流程。 - 自动利用 Catalyst 优化器对查询计划进行优化。 - 数据不可变且延迟执行,适合批处理场景。 下面是一个简单的例子展示了如何使用 DataFrame API 来完成 WordCount: ```python from pyspark.sql import SparkSession from pyspark.sql.functions import col, split, explode if __name__ == "__main__": spark = SparkSession.builder \ .appName("WordCount") \ .master("local[*]") \ .getOrCreate() # 加载文本文件到 DataFrame df = spark.read.text("/path/to/input/file") # 将每行拆分为单词列表 words_df = df.select(explode(split(col("value"), "\\s+")).alias("word")) # 对每个单词计数 result_df = words_df.groupBy("word").count().orderBy(col("count").desc()) # 展示结果 result_df.show(truncate=False) spark.stop() ``` 此代码片段说明了如何通过 DataFrame API 实现分词、聚合以及排序功能[^4]。 --- ##### 2. **SQL 风格** 对于熟悉 SQL 的用户来说,可以直接注册临时视图并通过 SQL 查询来获取所需的结果。这种方式的优点在于语法简单直观,易于维护。 继续以上述 WordCount 为例,可以改写为如下 SQL 形式: ```python from pyspark.sql import SparkSession if __name__ == "__main__": spark = SparkSession.builder \ .appName("WordCount_SQL") \ .master("local[*]") \ .getOrCreate() # 加载文本文件到 DataFrame创建临时视图 df = spark.read.text("/path/to/input/file") df.createOrReplaceTempView("lines") # 执行 SQL 查询统计单词频率 word_count_df = spark.sql(""" SELECT word, COUNT(*) AS count FROM ( SELECT EXPLODE(SPLIT(value, '\\s+')) AS word FROM lines ) GROUP BY word ORDER BY count DESC """) # 显示前几条记录 word_count_df.show(truncate=False) spark.stop() ``` 上述代码同样实现了基于 SQL 的 WordCount 功能[^5]。 --- #### 联系与区别 | 特性 | DataFrame API | SQL 风格 | |---------------------|---------------------------------------|---------------------------------------| | 编程模型 | 基于 Python 或 Scala 的函数式编程 | 类似传统的 SQL 查询 | | 学习曲线 | 较陡峭 | 如果已有 SQL 基础,则较为平缓 | | 性能 | 同样由 Catalyst 优化 | 同样由 Catalyst 优化 | | 灵活性 | 更加灵活,适用于复杂业务逻辑 | 主要针对固定模式的查询需求 | 两者的核心差异体现在表达方式的不同:前者更适合开发者习惯,而后者则更贴近分析师的需求[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值