目录
1. pandas和pyspark对比
1.1. 工作方式
- pandas
单机single machine tool,没有并行机制parallelism,不支持Hadoop,处理大量数据有瓶颈 - pyspark
分布式并行计算框架,内建并行机制parallelism,所有的数据和操作自动并行分布在各个集群结点上。以处理in-memory数据的方式处理distributed数据。支持Hadoop,能处理大量数据。
1.2. 延迟机制
- pandas
not lazy-evaluated - pyspark
lazy-evaluated
1.3. 内存缓存
- pandas
单机缓存 - pyspark
persist() or cache()将转换的RDDs保存在内存
1.4. DataFrame可变性
- pandas
Pandas中DataFrame是可变的 - pyspark
Spark中RDDs是不可变的,因此DataFrame也是不可变的
1.5. 创建
- pandas
从spark_df转换:pandas_df = spark_df.toPandas()
,或读取其他数据 - pyspark
从pandas_df转换:spark_df = SQLContext.createDataFrame(pandas_df)
另外,createDataFrame支持从list转换spark_df,其中list元素可以为tuple,dict,rdd
1.6. index索引
- pandas
自动创建 - pyspark
没有index索引,若需要则要额外创建该列
1.7. 行结构
- pandas
Series结构,属于Pandas DataFrame结构 - pyspark
Row结构,属于Spark DataFrame结构
1.8. 列结构
- pandas
Series结构,属于Pandas DataFrame结构 - pyspark
Column结构,属于Spark DataFrame结构,如:DataFrame[name: string]
1.9. 列名称
- pandas
不允许重名 - pyspark
允许重名,修改列名采用alias方法
1.10. 列添加
- pandas
df[“xx”] = 0
- pyspark
df.withColumn(“xx”, 0).show() 会报错
from pyspark.sql import functions
df.withColumn(“xx”, functions.lit(0)).show()
1.11. 列修改
- pandas
原来有df[“xx”]
列,df[“xx”] = 1
- pyspark
原来有df[“xx”]
列,df.withColumn(“xx”, 1).show()
1.12. 显示
- pandas
df 输出具体内容 - pyspark
df 不输出具体内容,输出具体内容用show方法.
输出形式:DataFrame[age: bigint, name: string]
以树的形式打印概要:df.printSchema()
用df.collect(5)
1.13. 排序
- pandas
df.sort_index()
按轴进行排序
df.sort()
在列中按值进行排序 - pyspark
df.sort()
在列中按值进行排序
1.14. 选择或切片
pandas | pyspark |
---|---|
df.name 输出具体内容 |
df[] 不输出具体内容,输出具体内容用show方法。 |
df['name'] 不输出具体内容,输出具体内容用show方法 |
|
df['name'] 输出具体内容 |
df.select() 选择一列或多列. |
df.select('name') |
|
切片 df.select(df['name'], df['age']+1) |
|
df[0] ,df.ix[0] |
df.first() |
df.head(2) |
df.head(2), df.take(2) |
df.tail(2) |
|
切片 df.ix[:3] 或者df.ix[:'xx'] 或者df[:'xx'] |
|
df.loc[] 通过标签进行选择 |
|
df.iloc[] 通过位置进行选择 |
1.15. 过滤
- pandas
df[df['age']>21]
- pyspark
df.filter(df['age']>21)
或者df.where(df['age']>21)
1.16. 整合
- pandas
df.groupby('age')
df.groupby('A').avg('B')
- pyspark
df.groupBy('age')
df.groupBy('A').avg('B').show()
应用单个函数
from pyspark.sql import functions
导入内置函数库
df.groupBy('A').agg(functions.avg('B'), functions.min('B'), functions.max('B')).show()
应用多个函数
1.17. 统计
- pandas
df.count()
输出每一列的非空行数
df.describe()
描述某些列的count, mean, std, min, 25%, 50%, 75%, max - pyspark
df.count()
输出总行数
df.describe()
描述某些列的count, mean, stddev, min, max
1.18. 合并
- pandas
Pandas下有concat
方法,支持轴向合并
Pandas下有merge
方法,支持多列合并
同名列自动添加后缀,对应键仅保留一份副本
df.join()
支持多列合并
df.append()
支持多行合并 - pyspark
Spark下有join方法即df.join()
同名列不自动添加后缀,只有键值完全匹配才保留一份副本
1.19. 失数据处理
pandas | pyspark |
---|---|
对缺失数据自动添加NaNs | 不自动添加NaNs,且不抛出错误 |
fillna函数:df.fillna() |
fillna函数:df.na.fill() |
dropna函数:df.dropna() |
dropna函数:df.na.drop() |
1.20. SQL语句
- pandas
import sqlite3
pd.read_sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19")
- pyspark
1.表格注册:把DataFrame结构注册成SQL语句使用类型
df.registerTempTable('people')
或者sqlContext.registerDataFrameAsTable(df, 'people')
spark.sql('SELECT name, age FROM people WHERE age >= 13 AND age <= 19')
2.功能注册:把函数注册成SQL语句使用类型
spark.registerFunction('stringLengthString', lambda x: len(x))
spark.sql("SELECT stringLengthString('test')")
1.21. 两者互相转换
pandas_df = spark_df.toPandas()
spark_df = spark.createDataFrame(pandas_df)
1.22. 函数应用
- pandas
df.apply(f)
将df的每一列应用函数f - pyspark
df.foreach(f)
或者df.rdd.foreach(f)
将df的每一列应用函数f
df.foreachPartition(f)
或者df.rdd.foreachPartition(f)
将df的每一块应用函数f
1.23. map-reduce操作
- pandas
map-reduce操作map(func, list)
,reduce(func, list)
返回类型seq - pyspark
df.map(func)
,df.reduce(func)
返回类型seqRDDs
1.24. diff操作
- pandas
有diff操作,处理时间序列数据(Pandas会对比当前行与上一行) - pyspark
没有diff操作(Spark的上下行是相互独立,分布式存储的)