[转]Spark与Pandas中DataFrame对比(详细)

来源:互联网 发布:linux安装jdk1.7.0 79 编辑:程序博客网 时间:2024/06/09 16:01
 PandasSpark工作方式单机single machine tool,没有并行机制parallelism
不支持Hadoop,处理大量数据有瓶颈分布式并行计算框架,内建并行机制parallelism,所有的数据和操作自动并行分布在各个集群结点上。以处理in-memory数据的方式处理distributed数据。
支持Hadoop,能处理大量数据延迟机制not lazy-evaluatedlazy-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,rddlist,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”] = 0df.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%, maxdf.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的每一列应用函数fdf.foreach(f) 或者 df.rdd.foreach(f) 将df的每一列应用函数f
df.foreachPartition(f) 或者 df.rdd.foreachPartition(f) 将df的每一块应用函数fmap-reduce操作map(func, list),reduce(func, list) 返回类型seqdf.map(func),df.reduce(func) 返回类型seqRDDsdiff操作有diff操作,处理时间序列数据(Pandas会对比当前行与上一行)没有diff操作(Spark的上下行是相互独立,分布式存储的)

转载连接:http://www.lining0806.com/spark与pandas中dataframe对比/


diff()操作举例如下:

1. Invoke ipython console -profile=pyspark:
In [1]: from pyspark import SparkConf, SparkContext, SQLContext
In [2]: import pandas as pd
In [3]: sqlcontext = SQLContext(sc)
2. Computing diff on a column in Pandas:
In [4]: df = sqlCtx.createDataFrame([(1, 4), (1, 5), (2, 6),
(2, 6), (3, 0)], ["A", "B"])
In [5]: pdf = df.toPandas()
In [6]: pdf
Out[6]:
   A B
0 1 4
1 1 5
2 2 6
3 2 6
4 3 0
In [7]: pdf['diff'] = pdf.B.diff()
In [8]: pdf
Out[8]:
   A B diff
0 1 4 NaN
1 1 5 1
2 2 6 1
3 2 6 0
4 3 0 -6
3. Computing diff on a column given a specific key using the Window operation:
In [9]: from pyspark.sql.window import Window
In [10]: window_over_A = Window.partitionBy("A").orderBy("B")
In [11]: df.withColumn("diff", F.lead("B").over(window_over_A) -
df.B).show()
+---+---+-----+
| A| B|diff |
+---+---+-----+
| 1 | 4 | 1 |
| 1 | 5 | null|
| 2 | 6 | 0 |
| 2 | 6 | null|
| 3 | 0 | null|
+---+---+-----+