【Spark】(task3)SparkSQL基础

举报
野猪佩奇996 发表于 2022/03/19 22:26:10 2022/03/19
【摘要】 文章目录 零、回顾一、使用Spark SQL完成任务1里面的数据筛选二、使用Spark SQL完成任务2里面的统计(列可以不统计)三、使用Spark SQL完成任务3的分组统计 零、回顾 ...

零、回顾

  • 【Spark】(task1)PySpark基础数据处理
    • 使用Python链接Spark环境
    • 创建dateframe数据
    • 用spark执行以下逻辑:找到数据行数、列数
    • 用spark筛选class为1的样本
    • 用spark筛选language >90 或 math> 90的样本
  • 【Spark】(task2)PySpark数据统计和分组聚合
    • 一、数据统计
      • 读取文件
      • 保存读取的信息
      • 分析每列的类型,取值个数
      • 分析每列是否包含缺失值
    • 二、分组聚合
      • 学习groupby分组聚合的使用
      • 学习agg分组聚合的使用
      • transform的使用

这次的task3很简单,就是和mysql一样的东西,不过要连接spark集群环境进行,注意列名类型。

一、使用Spark SQL完成任务1里面的数据筛选

先是创建dataframe数据:

import pandas as pd
from pyspark.sql import SparkSession
# 创建spark应用
spark = SparkSession.builder.appName('mypyspark').getOrCreate()
# 用python链接spark环境

# 创建dataframe数据
test = spark.createDataFrame([('001','1',100,87,67,83,98), ('002','2',87,81,90,83,83), ('003','3',86,91,83,89,63),
                            ('004','2',65,87,94,73,88), ('005','1',76,62,89,81,98), ('006','3',84,82,85,73,99),
                            ('007','3',56,76,63,72,87), ('008','1',55,62,46,78,71), ('009','2',63,72,87,98,64)],                           
                             ['number','class','language','math','english','physic','chemical'])

test.createOrReplaceTempView('table')

spark.sql('select * from table').show()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

其实和sql基本语法一样,没啥讲的,基本的selectwherecount操作:

# 数据表的行数
spark.sql('select count(*) as row_num from table').show()

# 数据的列数
spark.sql('show columns from table').count() # 7

# 用spark筛选class为1的样本
sql_seq = 'select * from table where class = 1'
spark.sql(sql_seq).show()

# 用spark筛选language>90或math>90的样本
sql_seq = 'select * from table where language > 90 or math >90'
spark.sql(sql_seq).show()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

结果为:

+-------+
|row_num|
+-------+
|      9|
+-------+

+------+-----+--------+----+-------+------+--------+
|number|class|language|math|english|physic|chemical|
+------+-----+--------+----+-------+------+--------+
|   001|    1|     100|  87|     67|    83|      98|
|   005|    1|      76|  62|     89|    81|      98|
|   008|    1|      55|  62|     46|    78|      71|
+------+-----+--------+----+-------+------+--------+

+------+-----+--------+----+-------+------+--------+
|number|class|language|math|english|physic|chemical|
+------+-----+--------+----+-------+------+--------+
|   001|    1|     100|  87|     67|    83|      98|
|   003|    3|      86|  91|     83|    89|      63|
+------+-----+--------+----+-------+------+--------+

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

二、使用Spark SQL完成任务2里面的统计(列可以不统计)

# 分析每列的类型,取值个数
sql_seq = 'describe table'
spark.sql(sql_seq).show()

# 看Type2列的的取值情况
sql_seq = 'select distinct `language` from table'
spark.sql(sql_seq).show()

# 分析每列是否含有缺失值(个数),此处木有
sql_seq = 'select * from table where `class` is null'
spark.sql(sql_seq).show()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

结果如下,注意列的类型,如果是字符串则需要左右加上两个点。

+--------+---------+-------+
|col_name|data_type|comment|
+--------+---------+-------+
|  number|   string|   null|
|   class|   string|   null|
|language|   bigint|   null|
|    math|   bigint|   null|
| english|   bigint|   null|
|  physic|   bigint|   null|
|chemical|   bigint|   null|
+--------+---------+-------+

+--------+
|language|
+--------+
|      87|
|     100|
|      65|
|      86|
|      84|
|      76|
|      63|
|      56|
|      55|
+--------+

+------+-----+--------+----+-------+------+--------+
|number|class|language|math|english|physic|chemical|
+------+-----+--------+----+-------+------+--------+
+------+-----+--------+----+-------+------+--------+

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

三、使用Spark SQL完成任务3的分组统计

这里用另一个数据集(Pokemon):

import pandas as pd
from pyspark.sql import SparkSession
# 创建spark应用
spark = SparkSession.builder.appName('mypyspark').getOrCreate()
# 用python链接spark环境

from pyspark import SparkFiles
spark.sparkContext.addFile('https://cdn.coggle.club/Pokemon.csv')

#path = "file://"+SparkFiles.get("Pokemon.csv")
# 将读取的进行保存,表头也需要保存
#df = spark.read.csv(path=path, header=True, inferSchema= True)

df = spark.read.csv(SparkFiles.get('Pokemon.csv'), 
                    header = True,
                    inferSchema = True)
df.show(5)

###### 数据集如下 ###############
+--------------------+------+------+-----+---+------+-------+-------+-------+-----+----------+---------+
|                Name|Type 1|Type 2|Total| HP|Attack|Defense|Sp. Atk|Sp. Def|Speed|Generation|Legendary|
+--------------------+------+------+-----+---+------+-------+-------+-------+-----+----------+---------+
|           Bulbasaur| Grass|Poison|  318| 45|    49|     49|     65|     65|   45|         1|    false|
|             Ivysaur| Grass|Poison|  405| 60|    62|     63|     80|     80|   60|         1|    false|
|            Venusaur| Grass|Poison|  525| 80|    82|     83|    100|    100|   80|         1|    false|
|VenusaurMega Venu...| Grass|Poison|  625| 80|   100|    123|    122|    120|   80|         1|    false|
|          Charmander|  Fire|  null|  309| 39|    52|     43|     60|     50|   65|         1|    false|
+--------------------+------+------+-----+---+------+-------+-------+-------+-----+----------+---------+
only showing top 5 rows

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

分组聚合:

# 分组统计,使用Spark SQL完成任务3的分组统计——统计数据在Type 1分组下 HP的均值
sql_seq = 'select `Type 2`, avg(HP) from table2 group by `Type 2`'
spark.sql(sql_seq).show()

#### 结果如下 ########
+--------+------------------+
|  Type 2|           avg(HP)|
+--------+------------------+
|   Water|62.714285714285715|
|  Poison| 58.76470588235294|
|   Steel| 64.63636363636364|
|    Rock| 68.07142857142857|
|     Ice|              90.0|
|    null| 67.76683937823834|
|   Ghost|59.142857142857146|
|   Fairy| 64.30434782608695|
| Psychic| 72.21212121212122|
|  Dragon| 82.16666666666667|
|  Flying|  71.3917525773196|
|     Bug|53.333333333333336|
|Electric| 88.16666666666667|
|    Fire|             71.25|
|  Ground| 77.22857142857143|
|    Dark|             75.55|
|Fighting| 79.46153846153847|
|   Grass|             62.64|
|  Normal|              63.5|
+--------+------------------+

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/123588500

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。