pyspark入门--DataFrame基础

pyspark

是一个python操作spark的库, 可以方便我们进行spark数据处理

pyspark入门--DataFrame基础_第1张图片

安装

pip install pyspark

DataFrame(数据帧)

类似于表格

1-查看

项目结构

pyspark入门--DataFrame基础_第2张图片

people.json

pyspark支持查看json文件
[{
  "name": "Michael",
  "age": 12
},
{
  "name": "Andy",
  "age": 13
},
{
  "name": "Justin",
  "age": 8
}] 

1-show.py

from pyspark.sql import SparkSession
# 创建spark会话(连接)
spark = SparkSession.builder.appName('Basics').getOrCreate()
# 获取people.json里的数据
# option("multiline","true") 是为了能解析json数组
df = spark.read.option("multiline","true").json("people.json")
# 打印整个dataframe 
df.show()
# 打印dataframe的每个字段(列)的类型
df.printSchema()
# 打印dataframe有哪些字段(列)
print(df.columns)
# 打印dataframe的详细信息
df.describe().show() 

pyspark入门--DataFrame基础_第3张图片

pyspark入门--DataFrame基础_第4张图片

pyspark入门--DataFrame基础_第5张图片

pyspark入门--DataFrame基础_第6张图片

2-type/head/select/withColumn/withColumnRenamed/使用sql语句

from pyspark.sql import SparkSession
# 创建spark会话(连接)
spark = SparkSession.builder.appName('Basics').getOrCreate()
# 获取people.json里的数据
# option("multiline","true") 是为了能解析json数组
df = spark.read.option("multiline","true").json("people.json")
# 获取某列的类型(这个类型是pyspark自动推导的)
# df['xxx']表示取df的xxx列
print(type(df['age']))
# select,可以读取指定条件的数据
df.select('age').show()
## 读取多列
df.select('age','Name').show()
# 打印 头两个里,下标为0的
print(df.head(2)[0])
## row[0]可以取得row里的数据
print(df.head(2)[0][0])
# 添加一列,值为age*2
df.withColumn('newage',df['age']*2).show()
# 重命名某列
df.withColumnRenamed('age','new_age').show()
# 使用sql
## 注册临时sql视图
df.createOrReplaceTempView('people')
## 使用sql语句
res = spark.sql('select * from people')
res.show()
age_eq_13 = spark.sql('select * from people where age = 13')
age_eq_13.show()

pyspark入门--DataFrame基础_第7张图片

pyspark入门--DataFrame基础_第8张图片

pyspark入门--DataFrame基础_第9张图片

pyspark入门--DataFrame基础_第10张图片

pyspark入门--DataFrame基础_第11张图片

3-过滤器

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('ops').getOrCreate()
# header表示第一行是列名
df = spark.read.csv('train.csv',inferSchema=True,header=True)
df.printSchema()
df.show()
df.head(3)[0]
# 过滤器
df.filter('Sex == "male"').show()
# select 选择要显示的列
df.filter('Sex == "female"').select('Sex').show()
# select 选择要显示的列
df.filter('Sex == "female"').select(['Sex','Name']).show()
# 过滤器写法2
df.filter(df['Sex']=='male').select('Ticket').show()
# 过滤器 多条件
df.filter((df['Sex']=='male') & (df['Pclass']>1)).show()
# 过滤器 非 ~
df.filter(~(df['Pclass']>1)).show() 
# collect -> list
res = df.filter(df['Pclass']==2).collect()
print(res)
row = res[0]
# 转为字典
print(row.asDict())
print(row.asDict()['Pclass']) 

4-Groupby 分组

from pyspark.sql import SparkSession 
from pyspark.sql.functions import countDistinct,avg,stddev 
from pyspark.sql.functions import format_number
spark = SparkSession.builder.appName('aggs').getOrCreate() 
df = spark.read.csv('EcommerceCustomers.csv',inferSchema=True,header=True) 
df.show() 
df.printSchema() 
# 根据字段分组
df.groupBy('Avatar') 
# 分组求平均
df.groupBy('Avatar').mean().show() 
df.groupBy('Avatar').count().show() 
# 聚合 求'Time on Website'列的值的sum
df.agg({'Time on Website':'sum'}).show() 
df.agg({'Time on Website':'max'}).show() 
group_data = df.groupBy('Avatar') 
# 分组进行agg聚合(字典方式)操作
group_data.agg({'Time on Website':'max'}).show() 
# 求数据总数(不含重复数据)
df.select(countDistinct('Time on Website')).show() 
# alias 其别名
# avg 求平均
df.select(avg('Time on Website').alias('website')).show() 
# stddev 标准差
df.select(stddev('Time on Website')).show()  
web_std = df.select(stddev('Time on Website').alias('web')) 
web_std.show() 
# 保留2位
web_std.select(format_number('web',2).alias('web')).show() 
df.show() 
# 升序排列
df.orderBy('Time on App').select('Time on App').show() 
# 降序
df.orderBy(df['Time on App'].desc()).select(['Time on App','Email']).show()  

pyspark入门--DataFrame基础_第12张图片

pyspark入门--DataFrame基础_第13张图片

pyspark入门--DataFrame基础_第14张图片

pyspark入门--DataFrame基础_第15张图片

pyspark入门--DataFrame基础_第16张图片

pyspark入门--DataFrame基础_第17张图片

pyspark入门--DataFrame基础_第18张图片

5-缺失值处理

from pyspark.sql import SparkSession
from pyspark.sql.functions import mean 
spark = SparkSession.builder.appName('miss').getOrCreate()
df = spark.read.csv('miss.csv',header=True,inferSchema=True)
df.show() 
# 删除带缺失值的数据
df.na.drop().show() 
# thresh: null值数量超过thresh个的数据才被删除
df.na.drop(thresh=2).show() 
# how: 删除策略(all/any)
df.na.drop(how='all').show()
# subset: 指定子集(列)含null值的数据才删除 
df.na.drop(subset=['Name']).show()
# pyspark自可以自动推断类型,在填充缺失值时很有帮助
df.printSchema()
# 输入字符串,就自动填充字符串类型的数据
df.na.fill('FILL VALUE').show()
# 输入number,就自动填充number类型的数据
df.na.fill(0).show()
# 指定列填充指定数据
df.na.fill('No Name',subset=['Name']).show()
mean_val = df.select(mean(df['Sales'])).collect()
mean_sale = mean_val[0][0]
print(mean_sale) 
# 给缺失值填充该列的平均值
df.na.fill(mean_sale,['Sales']).show() 
df.na.fill(df.select(mean(df['Sales'])).collect()[0][0],['Sales']).show()

pyspark入门--DataFrame基础_第19张图片

pyspark入门--DataFrame基础_第20张图片

pyspark入门--DataFrame基础_第21张图片

pyspark入门--DataFrame基础_第22张图片

pyspark入门--DataFrame基础_第23张图片

pyspark入门--DataFrame基础_第24张图片

pyspark入门--DataFrame基础_第25张图片

pyspark入门--DataFrame基础_第26张图片

pyspark入门--DataFrame基础_第27张图片

6-时间类型处理

from pyspark.sql import SparkSession 
from pyspark.sql.functions import (dayofmonth,hour,dayofyear,
                                   month,year,weekofyear,
                                   format_number,date_format)
spark = SparkSession.builder.appName('miss').getOrCreate()
df = spark.read.csv('appl_stock.csv',header=True,inferSchema=True)
df.head(1)
df.select(['Date','Open']).show()
# 获取每个Date数据(year-month-day)的day
df.select(dayofmonth(df['Date'])).show()
# 获取每个Date数据(year-month-day)的month
df.select(month(df['Date'])).show()
# 获取每个Date数据(year-month-day)的year
df.select(year(df['Date'])).show()
# 得到Date数据里的year并作为新的一列合并到原表格
newdf = df.withColumn('Year',year(df['Date']))
# 每年的平均Close
result = newdf.groupBy('Year').mean().select(['Year','avg(Close)'])
# 重命名列
new = result.withColumnRenamed('avg(Close)','Average CLosing Price')
# 格式化新列,保留两位小数
new.select(['Year',format_number('Average CLosing Price',2).alias('avg close')]).show()

pyspark入门--DataFrame基础_第28张图片

pyspark入门--DataFrame基础_第29张图片

pyspark入门--DataFrame基础_第30张图片

pyspark入门--DataFrame基础_第31张图片

pyspark入门--DataFrame基础_第32张图片

你可能感兴趣的:(python,pyspark,spark)