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