sparkSQL面试题

一、查询所有数学课程成绩大于语文课程成绩的学生学号

数据

1,yuwen,43

1,shuxue,55

2,yuwen,77

2,shuxue,88

3,yuwen,98

3,shuxue,65

3,yingyu,88

基本步骤:

  • 进行行转列
  • 比较语文与数学的成绩

SQL代码:

sql 复制代码
with t1 as(
        SELECT id,sum(if(name = 'yuwen',score,0)) chinese,sum(if(name = 'shuxue',score,0)) math,sum(if(name = 'yingyu',score,0)) english FROM zuoye1 group by id
    )
    select id from t1 where math>chinese

sparkSQL代码

python 复制代码
import os
import re

from pyspark.sql import SparkSession

"""
------------------------------------------
  Description : TODO:
  SourceFile : _04-zuoye1
  Author  : zxx
  Date  : 2024/11/4
-------------------------------------------
"""
# 查询所有数学课程成绩大于语文课程成绩的学生学号
if __name__ == '__main__':
    os.environ['JAVA_HOME'] = 'D:/bigdata/03-java/java-8/jdk'
    # 配置Hadoop的路径,就是前面解压的那个路径
    os.environ['HADOOP_HOME'] = 'D:/bigdata/04-Hadoop/hadoop/hadoop-3.3.1/hadoop-3.3.1'
    # 配置base环境Python解析器的路径
    os.environ['PYSPARK_PYTHON'] = 'D:/bigdata/22-spark/Miniconda3/python.exe'  # 配置base环境Python解析器的路径
    os.environ['PYSPARK_DRIVER_PYTHON'] = 'D:/bigdata/22-spark/Miniconda3/python.exe'
    spark = SparkSession.builder.master("local[2]").appName("第一题").config(
        "spark.sql.shuffle.partitions", 2).getOrCreate()
    df = (spark.sparkContext.textFile("../../datas/zuoye2/zuoye1.txt")
          .map(lambda line: (re.split(",",line)[0],re.split(",",line)[1],re.split(",",line)[2])).toDF(["id","name","score"]))
    df.createOrReplaceTempView("zuoye1")
    spark.sql("""
    with t1 as(
        SELECT id,sum(if(name = 'yuwen',score,0)) chinese,sum(if(name = 'shuxue',score,0)) math,sum(if(name = 'yingyu',score,0)) english FROM zuoye1 group by id
    )
    select id from t1 where math>english
    """).show()
    # 关闭
    spark.stop()

运行结果:

二、查询每种爱好中年龄最大的人,如果有相同的年龄,并列显示。

数据

id;name;age;favor

1;huangbo;33;a,b,c,d,e

2;xuzheng;44;b,c

3;wangbaoqiang;33;c,d,e

4;fanbingbing;32;a,b,d

基本步骤:

  • 把favor列用炸裂函数explode炸开
  • 用排名函数进行排序,根据题意相同年龄要并列显示,故选用rank()
  • 用where筛选出排名第一的人

SQL代码:

sql 复制代码
with t1 as(
   select name,age,aihao from zuoye2 lateral view explode(split(favor,',')) t1 as aihao)
   ,t2 as(
   select aihao,name,rank() over(partition by aihao order by age) r1 from t1
   )
   select * from t2 where r1 = 1 order by aihao

sparkSQL代码:

python 复制代码
import os
import re

from pyspark.sql import SparkSession

"""
------------------------------------------
  Description : TODO:
  SourceFile : _04-zuoye1
  Author  : zxx
  Date  : 2024/11/4
-------------------------------------------
"""
# 查询每种爱好中年龄最大的人,如果有相同的年龄,并列显示。
if __name__ == '__main__':
    os.environ['JAVA_HOME'] = 'D:/bigdata/03-java/java-8/jdk'
    # 配置Hadoop的路径,就是前面解压的那个路径
    os.environ['HADOOP_HOME'] = 'D:/bigdata/04-Hadoop/hadoop/hadoop-3.3.1/hadoop-3.3.1'
    # 配置base环境Python解析器的路径
    os.environ['PYSPARK_PYTHON'] = 'D:/bigdata/22-spark/Miniconda3/python.exe'  # 配置base环境Python解析器的路径
    os.environ['PYSPARK_DRIVER_PYTHON'] = 'D:/bigdata/22-spark/Miniconda3/python.exe'
    spark = SparkSession.builder.master("local[2]").appName("第一次构建SparkSession").config(
        "spark.sql.shuffle.partitions", 2).getOrCreate()
    df = (spark.sparkContext.textFile("../../datas/zuoye2/zuoye2.txt").filter(lambda x:re.split(";",x)[0] !="id")
          .map(lambda line: (re.split(";",line)[0],re.split(";",line)[1],re.split(";",line)[2],
                             re.split(";",line)[3]
                             )
               ).toDF(["id","name","age","favor"]))
    df.createOrReplaceTempView("zuoye2")
    spark.sql("""
    with t1 as(
   select name,age,aihao from zuoye2 lateral view explode(split(favor,',')) t1 as aihao)
   ,t2 as(
   select aihao,name,rank() over(partition by aihao order by age) r1 from t1
   )
   select * from t2 where r1 = 1 order by aihao
    """).show()
    # 关闭
    spark.stop()

运行结果:

相关推荐
满昕欢喜3 小时前
SQL Server从入门到项目实践(超值版)读书笔记 20
数据库·sql·sqlserver
烛阴4 小时前
简单入门Python装饰器
前端·python
好开心啊没烦恼4 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
面朝大海,春不暖,花不开5 小时前
使用 Python 实现 ETL 流程:从文本文件提取到数据处理的全面指南
python·etl·原型模式
2301_805054566 小时前
Python训练营打卡Day59(2025.7.3)
开发语言·python
JAVA学习通6 小时前
Mybatis--动态SQL
sql·tomcat·mybatis
万千思绪6 小时前
【PyCharm 2025.1.2配置debug】
ide·python·pycharm
涤生大数据7 小时前
Apache Spark 4.0:将大数据分析提升到新的水平
数据分析·spark·apache·数据开发
微风粼粼8 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
云天徽上8 小时前
【PaddleOCR】OCR表格识别数据集介绍,包含PubTabNet、好未来表格识别、WTW中文场景表格等数据,持续更新中......
python·ocr·文字识别·表格识别·paddleocr·pp-ocrv5