111

2.2 创建DataFrame
1,创建dataFrame的步骤

​ 调用方法例如:spark.read.xxx方法

2,其他方式创建dataframe

createDataFrame:pandas dataframe、list、RDD

数据源:RDD、csv、json、parquet、orc、jdbc

jsonDF = spark.read.json(“xxx.json”)

jsonDF = spark.read.format(‘json’).load(‘xxx.json’)

parquetDF = spark.read.parquet(“xxx.parquet”)

jdbcDF = spark.read.format(“jdbc”).option(“url”,“jdbc:mysql://localhost:3306/db_name”).option(“dbtable”,“table_name”).option(“user”,“xxx”).option(“password”,“xxx”).load()
Transformation:延迟性操作

action:立即操作

s14

2.3 DataFrame API实现
基于RDD创建

from pyspark.sql import SparkSession
from pyspark.sql import Row

spark = SparkSession.builder.appName(‘test’).getOrCreate()
sc = spark.sparkContext

spark.conf.set(“spark.sql.shuffle.partitions”, 6)

直接创建==========

l = [(‘Ankit’,25),(‘Jalfaizy’,22),(‘saurabh’,20),(‘Bala’,26)]
rdd = sc.parallelize(l)
#为数据添加列名
people = rdd.map(lambda x: Row(name=x[0], age=int(x[1])))
#创建DataFrame
schemaPeople = spark.createDataFrame(people)
从csv中读取数据

从csv读取====

#加载csv类型的数据并转换为DataFrame
df = spark.read.format(“csv”).
option(“header”, “true”)
.load(“iris.csv”)
#显示数据结构
df.printSchema()
#显示前10条数据
df.show(10)
#统计总量
df.count()
#列名
df.columns
增加一列

=====增加一列(或者替换) withColumn=

#定义一个新的列,数据为其他某列数据的两倍
#如果操作的是原有列,可以替换原有列的数据
df.withColumn(‘newWidth’,df.SepalWidth * 2).show()
删除一列

删除一列 drop===============

#删除一列
df.drop(‘cls’).show()
统计信息

#================ 统计信息 describe================
df.describe().show()
#计算某一列的描述信息
df.describe(‘cls’).show()
提取部分列

=提取部分列 select

df.select(‘SepalLength’,‘SepalWidth’).show()
基本统计功能

==============基本统计功能 distinct count=

df.select(‘cls’).distinct().count()
分组统计

分组统计 groupby(colname).agg({‘col’:‘fun’,‘col2’:‘fun2’})

df.groupby(‘cls’).agg({‘SepalWidth’:‘mean’,‘SepalLength’:‘max’}).show()

avg(), count(), countDistinct(), first(), kurtosis(),

max(), mean(), min(), skewness(), stddev(), stddev_pop(),

stddev_samp(), sum(), sumDistinct(), var_pop(), var_samp() and variance()

自定义的汇总方法

自定义的汇总方法

import pyspark.sql.functions as fn
#调用函数并起一个别名
df.agg(fn.count(‘SepalWidth’).alias(‘width_count’),fn.countDistinct(‘cls’).alias(‘distinct_cls_count’)).show()
拆分数据集

#====================数据集拆成两部分 randomSplit ===========
#设置数据比例将数据划分为两部分
trainDF, testDF = df.randomSplit([0.6, 0.4])
采样数据

======采样数据 sample=

#withReplacement:是否有放回的采样
#fraction:采样比例
#seed:随机种子
sdf = df.sample(False,0.2,100)
查看两个数据集在类别上的差异

#查看两个数据集在类别上的差异 subtract,确保训练数据集覆盖了所有分类
diff_in_train_test = testDF.select(‘cls’).subtract(trainDF.select(‘cls’))
diff_in_train_test.distinct().count()
交叉表

====交叉表 crosstab=

df.crosstab(‘cls’,‘SepalLength’).show()
udf

udf:自定义函数

#================== 综合案例 + udf================

测试数据集中有些类别在训练集中是不存在的,找到这些数据集做后续处理

trainDF,testDF = df.randomSplit([0.99,0.01])

diff_in_train_test = trainDF.select(‘cls’).subtract(testDF.select(‘cls’)).distinct().show()

#首先找到这些类,整理到一个列表
not_exist_cls = trainDF.select(‘cls’).subtract(testDF.select(‘cls’)).distinct().rdd.map(lambda x :x[0]).collect()

#定义一个方法,用于检测
def should_remove(x):
if x in not_exist_cls:
return -1
else :
return x

#创建udf,udf函数需要两个参数:

Function

Return type (in my case StringType())

#在RDD中可以直接定义函数,交给rdd的transformatioins方法进行执行
#在DataFrame中需要通过udf将自定义函数封装成udf函数再交给DataFrame进行调用执行

from pyspark.sql.types import StringType
from pyspark.sql.functions import udf

check = udf(should_remove,StringType())

resultDF = trainDF.withColumn(‘New_cls’,check(trainDF[‘cls’])).filter(‘New_cls <> -1’)

resultDF.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值