作者:李呈祥,花名司麟 ,阿里云智能EMR团队高级技术专家,Apache Hive Committer, Apache Flink Committer,目前主要专注于EMR产品中开源计算引擎的优化工作。
Spark社区在Spark Packages网站中索引了许多第三方库,这些第三方库由不同的开发者贡献,作为Spark生态圈的一部分,扩充了Spark的使用范围和使用场景,其中很多对于我们日常的使用可能有帮助,我们准备开启一个系列文章介绍Spark Packages中一些有意思的第三方库,作为系列的第一篇,本文主要介绍Optimus,一个基于PySpark的简单易用的数据准备工具。
本文的部分内容源自Optimus官网和相关介绍文章,原文链接参考文末引用部分。
在Spark(Pyspark)的支持下,Optimus允许用户使用自己的或一组预先创建的数据转换功能来清理数据,对其进行概要分析并应用与数据分析和机器学习等场景,可以轻松地利用python语言进行所有这些操作。Optimus主要关注与以下几个方面:
创建一个可靠的API来访问和处理数据。
让用户轻松地从Pandas迁移。
使数据探索更加容易。
创建一个可靠的API来访问和处理数据
首先,我们来看看Optimus的基本使用方式
from pyspark.sql import SparkSession
from optimus import Optimus
// 创建context
spark = SparkSession.builder.appName('optimus').getOrCreate()
op= Optimus(spark)
// 加载数据
df = op.load.csv("../examples/data/foo.csv")
// 执行清理
new_df = df\
.rows.sort("rank","desc")\
.withColumn('new_age', df.age)\
.cols.lower(["names","function"])\
.cols.date_transform("date arrival", "yyyy/MM/dd", "dd-MM-YYYY")\
.cols.years_between("date arrival", "dd-MM-YYYY", output_cols = "from arrival")\
.cols.remove_accents("names")\
.cols.remove_special_chars("names")\
.rows.drop(df["rank"]>8)\
.cols.rename(str.lower)\
.cols.trim("*")\
.cols.unnest("japanese name", output_cols="other names")\
.cols.unnest("last position seen",separator=",", output_cols="pos")\
.cols.drop(["last position seen", "japanese name","date arrival", "cybertronian", "nulltype"])
//保存结果
new_df.save.csv("data/foo.csv")
Optimus基本PySpark框架,重新组织了对数据进行清理/准备的相关API,把数据处理整理为针对dataframe.rows和dataframe.cols两类操作,基于rows和cols实现了非常丰富的针对数据清理和准备相关的接口,用户可以使用这些接口非常方便高效地完成相关工作。在Optimus中,核心的数据操作可以归纳为如下几类:
创建一个DataFrame
用append()追加行或列
使用select()选择行或列
使用apply()更新或转换列数据
使用drop()删除行或列
使用read()