06 Spark SQL 及其DataFrame的基本操作
1.Spark SQL出现的 原因是什么?
答:在当今大数据时代,关系数据库已经不能满足各种新增的用户需求,如用户需要对不同数据源执行操作,执行机器学习,图像处理等高级分析。而spark SQL的出现就是用来弥补关系数据库的缺陷,满足用户需要进行融合关系查询,复杂分析算法等各种复杂的应用需求。
2.用spark.read 创建DataFrame
3.观察从不同类型文件创建DataFrame有什么异同?
4.观察Spark的DataFrame与Python pandas的DataFrame有什么异同?(参考 http://www.lining0806.com/spark%E4%B8%8Epandas%E4%B8%ADdataframe%E5%AF%B9%E6%AF%94/)
Pandas |
Spark |
|
工作方式 |
单机single machine tool,没有并行机制parallelism |
分布式并行计算框架,内建并行机制parallelism,所有的数据和操作自动并行分布在各个集群结点上。以处理in-memory数据的方式处理distributed数据。 |
延迟机制 |
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) |
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] |
列名称 |
不允许重名 |
允许重名 |
列添加 |
df[“xx”] = 0 |
df.withColumn(“xx”,
0).show() 会报错 |
列修改 |
原来有df[“xx”]列,df[“xx”] = 1 |
原来有df[“xx”]列,df.withColumn(“xx”, 1).show() |
显示 |
|
df 不输出具体内容,输出具体内容用show方法 |
df 输出具体内容 |
df.show() 输出具体内容 |
|
没有树结构输出形式 |
以树的形式打印概要:df.printSchema() |
|
|
df.collect() |
|
排序 |
df.sort_index() 按轴进行排序 |
|
df.sort() 在列中按值进行排序 |
df.sort() 在列中按值进行排序 |
|
选择或切片 |
df.name 输出具体内容 |
df[] 不输出具体内容,输出具体内容用show方法 |
df[] 输出具体内容, |
df.select() 选择一列或多列 |
|
df[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(“age”) |
统计 |
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 |
表格注册:把DataFrame结构注册成SQL语句使用类型 |
功能注册:把函数注册成SQL语句使用类型 |
||
两者互相转换 |
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 |
map-reduce操作 |
map(func, list),reduce(func, list) 返回类型seq |
df.map(func),df.reduce(func) 返回类型seqRDDs |
diff操作 |
有diff操作,处理时间序列数据(Pandas会对比当前行与上一行) |
没有diff操作(Spark的上下行是相互独立,分布式存储的) |