sparkSQL的使用

文章介绍了如何使用SparkSQL处理结构化数据,包括从RDD构建DataFrame,读取本地文件(如TXT、CSV),以及数据写出(如Text、CSV、JSON、Parquet)。还探讨了DSL函数的用法,如agg、withColumnRenamed等,并讲解了SparkSQL的catalyst优化器和执行流程,包括断言下推和列值裁剪等优化策略。
摘要由CSDN通过智能技术生成

sparksql只能处理结构化数据

基于rdd构建dataframe对象
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StringType, IntegerType

if __name__ == '__main__':
    spark = SparkSession.builder.appName('test').master('local[*]').getOrCreate()

    sc = spark.sparkContext
    #基于rdd建表
    rdd = sc.textFile('../data/input/word.txt').map(lambda x:x.split(' ')).\
        map(lambda x:(x[0],int(x[1])))
        
    ### 使用rdd构建dataframe
    df = spark.createDataFrame(rdd,schema=['name','age'])
    df.printSchema()
    df.show(20,False)
    df.createOrReplaceTempView('people')
    spark.sql('select * from people where age<20').show()
    
    #使用toDF的方式构建dataframe
    df = rdd.toDF(['name','age'])
    df.printSchema()
    df.show()
    
    # 使用structType的方式构建dataframe
    schema = StructType.add('name',StringType(),nullable=True).add('age',IntegerType(),nullable=False)
    df2 = rdd.toDF(schema=schema)
    df2.printSchema()
    df2.show()


sparksql读取本地文件
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StringType, IntegerType
import pandas as pd
if __name__ == '__main__':
    spark = SparkSession.builder.appName('test').master('local[*]').config('spark.sql.shuffle.partitions',2).getOrCreate()

    sc = spark.sparkContext
    schema = StructType().add('data',StringType(),nullable=True)
    # 读取txt文件
    df = spark.read.format('text').schema(schema=schema).load('../data/input/word.txt')
	# 读取csv文件
    df = spark.read.format('csv').option('sep',',').option('header',True).load('../data/input/word.txt')

    df.printSchema()
    df.show()
    
数据的写出(text,csv,json,parqeut)

在这里插入图片描述

DSL函数用法汇总

agg,是GroupData对象的api,作用是可以写多个聚合
alias,是column对象的api,可以针对一个列,进行改名
withColumnRenamed,是DataFrame的api,可以对DF的列进行改名,一次改一列,改多列可用链式调用
orderBy,DataFrame的api,进行排序参数1是要排序的字段,参数2是升序降序
first,DataFrame的api,去除DF的第一行数据,返回值是一个Row对象.是一个数组类型,用row[‘列名’]来取出当前值
df.dropDuplicates.show() 去重函数,无参数时是对所有列去重,可以加入参数对指定列去重dropDuplicates([‘age’])
df.dropna().show() 删除空值,dropna(thresh=2,subset=[‘name’,‘age’])这两列如果数据没有两列就会被删除
df.fillna().show() 把空值填充fillna({‘name’:‘未知姓名’,‘age’:1}),把名字那栏空值填为未知姓名,age为1

spark.sql.shuffle.partitions参数的设置
    spark = SparkSession.builder.appName('test').master('local[*]').config('spark.sql.shuffle.partitions',2).getOrCreate()

设置参数的意义是提高local模式下的性能,yarn集群下要根据cpu核数的2~4倍进行设置.

sqark.sql使用ntile对数据进行分组

sqark.sql(‘select * ,ntile(6) over(order by score desc) from stu’).show
#对stu库的数据实行6等分.

catalyst优化器

sql的执行顺序为

  • from
  • where
  • group by
  • having
  • select
  • order by
  • limit

常见的两种优化方式

  • 断言下推:将逻辑判断提前到前面比如where,以减少shuffle阶段的数据量
  • 列值裁剪:将加载的列尽可能的进行裁剪,尽量减少被处理数据的宽度.非常适合parquet储存方式

在这里插入图片描述

sparksql的执行流程

  • 提交sparksql代码
  • 执行catalyst优化
    1.生成原始的AST语法树
    2.标记AST元数据
    3.进行断言下移和列值裁剪,以及其他方面的优化作用到AST上
    4.将最终AST得到,生成执行计划.
    5.将执行计划翻译成层RDD代码
  • driver执行环境入口构建(sparksession)
  • DAG调度器规划逻辑任务
  • TASK调度器分配逻辑任务到具体的executor上工作,并监控管理任务.
  • executor干活

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值