Spark DataFrame 介绍

本文深入探讨了DataFrame在Apache Spark中的核心作用,包括其设计目标、特性和用法,展示如何构建和操作分布式数据集,以及与Spark SQL、Pandas的交互,并在高级分析和机器学习场景中的应用实例。同时,介绍了DataFrame背后的实现机制,如智能优化和代码生成,以及支持的数据格式和数据源,最终阐述了DataFrame在大数据和数据科学领域的强大潜力。

DataFrame的目标是让开发大数据的并行程序更加简单,受众更加广泛。DF受R & Python(Pandas)启发,被设计成支持 Big Data & Data Science Application. 作为RDD API的扩展,他的特性如下:
* 高扩展性
* 广泛支持各种数据格式 & 存储系统
* Spark Sql Catalyst Optimizer提供执行优化和代码生成
* 和其他大数据工具和框架的无缝集成
* 支持Python, java, scala, R(SparkR) Api

什么是DataFrame

In Spark,DF 是一个通过列组织起来的分布式数据集合,它类似传统数据库的一个表。可以通过各种方式构建DF:stuctured File(json,parquet…), tables in Hive, external DB, or existing RDDs.
example:

# Constructs a DataFrame from the users table in Hive.
users = context.table("users")

# from JSON files in S3
logs = context.load("s3n://path/to/data.json", "json")

怎么使用DataFrame

创建DF之后,它针对分布式数据操作提供了一套domain-specific language支持。
example:

# Create a new DataFrame that contains “young users” only
young = users.filter(users.age < 21)

# Alternatively, using Pandas-like syntax
young = users[users.age < 21]

# Increment everybody’s age by 1
young.select(young.name, young.age + 1)

# Count the number of young users by gender
young.groupBy("gender").count()

# Join young users with another DataFrame called logs
young.join(logs, logs.userId == users.userId, "left_outer")

与spark sql集成的操作:

young.registerTempTable("young")
context.sql("SELECT count(*) FROM young")

与Pandas的相互转换

# Convert Spark DataFrame to Pandas
pandas_df = young.toPandas()

# Create a Spark DataFrame from Pandas
spark_df = context.createDataFrame(pandas_df)

DF的执行也是lazy的,这样执行可以进行各种优化: predict push-down & bytecode generation. 并且DF在集群中也是并行执行的。

支持的数据格式和数据源

支持的数据格式如下:
这里写图片描述

通过Spark Sql external data source API, DF 可以执行任意的第三方数据格式/数据源。比如:Avro, CSV, ES, Hbase, Cassandra….
支持各种数据源和数据格式后, DF可以将各种不同源的数据组合到一起,如下所示:

users = context.jdbc("jdbc:postgresql:production", "users")
logs = context.load("/path/to/traffic.log")
logs.join(users, logs.userId == users.userId, "left_outer") \
  .groupBy("userId").agg({"*": "count"})

典型运用:Advanced Analysis & Machine Learning

与Machine Learning集成

// 构建 ML Pipeline
tokenizer = Tokenizer(inputCol="text", outputCol="words")
hashingTF = HashingTF(inputCol="words", outputCol="features")
lr = LogisticRegression(maxIter=10, regParam=0.01)
pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])

// 与DF 一起使用
df = context.load("/path/to/data")
model = pipeline.fit(df)

高级分析:

df = context.load("/path/to/people.json")
# RDD-style methods such as map, flatMap are available on DataFrames
# Split the bio text into multiple words.
words = df.select("bio").flatMap(lambda row: row.bio.split(" "))
# Create a new DataFrame to count the number of words
words_df = words.map(lambda w: Row(word=w, cnt=1)).toDF()
word_counts = words_df.groupBy("word").sum()

背后实现:Intelligent Optimization & Code Generation

DF会利用spark sql的执行引擎Catalyst optimizer来进行执行优化。主要体现在两点:

  1. 执行逻辑优化,比如PPD
  2. 编译成物理执行计划并生成JVM Bytecode. 比如自动选择broadcast join还是shuffle join.

DF执行逻辑直接编译成 JVM Bytecode的对比测试:
这里写图片描述

### Spark DataFrame 简介 Apache Spark 是一个用于大规模数据处理的统一分析引擎,支持多种编程语言,包括 Python、Scala、Java 和 R。Spark DataFrameSpark 提供的一种高级抽象,用于处理结构化数据。它类似于关系型数据库中的表或 Pandas DataFrame,但具有更强的可扩展性和性能优化能力[^1]。 Spark DataFrame 提供了丰富的 API,可以用于数据清洗、转换、聚合和分析等操作。它支持多种数据源,包括 Parquet、JSON、CSV、JDBC 数据库等,并且可以与 Spark SQL 无缝集成,允许用户使用 SQL 语句查询数据[^1]。 ### 创建 Spark DataFrame Spark DataFrame 可以通过多种方式创建,包括从外部数据源加载数据、从 RDD 转换而来,或者通过 Spark SQL 查询生成。以下是一个从 JSON 文件创建 DataFrame 的示例: ```python from pyspark.sql import SparkSession # 创建 SparkSession spark = SparkSession.builder.appName("DataFrameExample").getOrCreate() # 从 JSON 文件加载数据 df = spark.read.json("path/to/data.json") # 显示 DataFrame 的前几行 df.show() ``` 上述代码展示了如何使用 `SparkSession` 来读取 JSON 文件,并将其转换为 DataFrame。`show()` 方法可以用于查看数据的前几行内容[^1]。 ### DataFrame 常用操作 Spark DataFrame 提供了多种方法用于数据操作,包括选择列、过滤行、排序、聚合等。以下是一些常见的操作示例: #### 选择列 ```python # 选择特定的列 df.select("name", "age").show() ``` #### 过滤行 ```python # 过滤出年龄大于 20 的记录 df.filter(df.age > 20).show() ``` #### 排序 ```python # 按照年龄升序排序 df.orderBy(df.age.asc()).show() ``` #### 聚合 ```python # 计算平均年龄 df.agg({"age": "mean"}).show() ``` #### 分组和聚合 ```python # 按照性别分组并计算平均年龄 df.groupBy("gender").avg("age").show() ``` 这些操作可以组合使用,以实现复杂的数据处理任务。Spark DataFrame 的 API 设计类似于 SQL 查询,因此对于熟悉 SQL 的用户来说非常直观[^1]。 ### 数据清洗和转换 在数据处理过程中,数据清洗和转换是非常重要的步骤。Spark DataFrame 提供了多种方法来处理缺失值、重复值和数据类型转换。 #### 处理缺失值 ```python # 删除包含空值的行 df.na.drop().show() # 填充空值 df.na.fill(0).show() ``` #### 数据类型转换 ```python from pyspark.sql.functions import col # 将年龄列转换为整数类型 df.withColumn("age", col("age").cast("integer")).show() ``` #### 添加新列 ```python from pyspark.sql.functions import lit # 添加一个新列,值为固定值 df.withColumn("new_column", lit(1)).show() ``` 这些操作可以帮助用户将数据转换为适合分析的格式,从而提高数据质量[^1]。 ### 数据保存 处理完数据后,可以将 DataFrame 保存到外部存储系统中,如 Parquet、JSON、CSV 或数据库。 ```python # 将 DataFrame 保存为 Parquet 文件 df.write.parquet("path/to/output.parquet") # 将 DataFrame 保存为 JSON 文件 df.write.json("path/to/output.json") ``` Spark 提供了高效的写入机制,支持多种文件格式和压缩选项,能够满足不同的存储需求[^1]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值