Spark DataFrame小试牛刀

Spark 1.3 版本引入了 DataFrame API,大幅提升了处理大规模结构化数据的性能,支持 JSON、MySQL、Hive 等数据源,并简化了数据处理流程。

三月中旬,Spark发布了最新的1.3.0版本,其中最重要的变化,便是DataFrame这个API的推出。DataFrame让Spark具备了处理大规模结构化数据的能力,在比原有的RDD转化方式易用的前提下,计算性能更还快了两倍。这一个小小的API,隐含着Spark希望大一统「大数据江湖」的野心和决心。DataFrame像是一条联结所有主流数据源并自动转化为可并行处理格式的水渠,通过它Spark能取悦大数据生态链上的所有玩家,无论是善用R的数据科学家,惯用SQL的商业分析师,还是在意效率和实时性的统计工程师。

以一个常见的场景 -- 日志解析为例,有时我们需要用到一些额外的结构化数据(比如做IP和地址的映射),通常这样的数据会存在MySQL,而访问的方式有两种:一是每个worker远程去检索数据库,弊端是耗费额外的网络I/O资源;二是使用JdbcRDD的API转化为RDD格式,然后编写繁复的函数去实现检索,显然要写更多的代码。而现在,Spark提供了一种新的选择,一行代码就能实现从MySQL到DataFrame的转化,并且支持SQL查询。

实例

首先我们在本地放置了一个JSON文件,文件内容如下:

 {"name":"Michael"}
 {"name":"Andy", "age":30}
 {"name":"Justin", "age":19}

然后我们进入spark-shell,控制台的提示说明Spark为我们创建了一个叫sqlContext的上下文,注意,它是DataFrame的起点。
接下来我们希望把本地的JSON文件转化为DataFrame

scala> val df = sqlContext.jsonFile("/path/to/your/jsonfile")
df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]

从控制台的提示可以得知,我们成功创建了一个DataFrame的对象,包含agename两个字段。
DataFrame自带的玩法就多了:

// 输出表结构
df.printSchema()

// 选择所有年龄大于21岁的人,只保留name字段
df.filter(df("age") > 21).select("name").show()

// 选择name,并把age字段自增
df.select("name", df("age") + 1).show()

// 按年龄分组计数
df.groupBy("age").count().show()

// 左联表(注意是3个等号!)
df.join(df2, df("name") === df2("name"), "left").show()

此外,我们也可以把DataFrame对象转化为一个虚拟的表,然后用SQL语句查询,比如下面的命令就等同于df.groupBy("age").count().show()

df.registerTempTable("people")
sqlContext.sql("select age, count(*) from people group by age").show()

当然,Python有同样丰富的API(由于最终都是转化为JVM bytecode执行,Python和Scala的效率是一样的),而且Python还提供了类Pandas的操作语法。关于Python的API,可以参考Spark新年福音:一个用于大规模数据科学的API——DataFrame

MySQL

除了JSON之外,DataFrame现在已经能支持MySQL、Hive、HDFS、PostgreSQL等外部数据源,而对关系数据库的读取,是通过jdbc实现的。

对于不同的关系数据库,必须在SPARK_CLASSPATH变量中加入对应connector的jar包,比如希望连接MySQL的话应该这么启动spark-shell

SPARK_CLASSPATH=mysql-connector-java-x.x.x-bin.jar spark-shell

下面要将一个MySQL表转化为DataFrame对象:

val jdbcDF = sqlContext.load("jdbc", Map("url" -> "jdbc:mysql://localhost:3306/your_database?user=your_user&password=your_password", "dbtable" -> "your_table"))

然后十八般武艺又可以派上用场了。

Hive

Spark提供了一个HiveContext的上下文,其实是SQLContext的一个子类,但从作用上来说,sqlContext也支持Hive数据源。只要在部署Spark的时候加入Hive选项,并把已有的hive-site.xml文件挪到$SPARK_HOME/conf路径下,我们就可以直接用Spark查询包含已有元数据的Hive表了:

sqlContext.sql("select count(*) from hive_people").show()

结语

Spark的目标在于成为一个跨环境、跨语言、跨工具的大数据处理和分析平台。DataFrame的推出很好诠释了这一目标,从初步的使用来看确实很容易上手。随着性能和稳定性的持续优化,我相信某一天所有玩数据的人,都可以使用Spark作为惟一的平台入口。

转载自: http://segmentfault.com/a/1190000002614456点击打开链接

### 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、付费专栏及课程。

余额充值