【无标题】【博学谷学习记录】超强总结,用心分享 | 狂野大数据-SparkSQL入门案例学习分享


一、Spark SQL与Hive异同

  • 1- 都是分布式计算的引擎
  • 2- 都可以处理大规模的数据, 都限定结构化数据
  • 3- 都可以基于Yarn集群运行

不同点:

  • 1- Spark SQL是基于内存计算, 而Hive SQL是基于磁盘来进行计算的
  • 2- Spark SQL没有元数据管理的服务(自己维护), 而Hive SQL是有metastore的元数据管理服务项
  • 3- Spark SQL底层执行Spark RDD程序, 而Hive SQL底层执行MR
  • 4- Spark SQL可以编写SQL 也可以编写代码, 但是HIVE SQL仅能编写SQL语句

二、Spark SQL的数据结构对比

在这里插入图片描述

RDD:  存储直接就是对象, 比如在图中, 存储的就是一个皮尔斯同的对象, 但是里面有什么数据,不太清楚

dataFrame: 将person中各个字段的数据, 进行格式化存储, 形成一个dataFrame, 可以直接看到数据

dataSet: 将Preston对象中数据都按照结构化的方式存储好, 同时保留对象的类型, 从而知道来源于那一个person的对象

由于Python不支持泛型, 所以无法使用dataSet类型, 客户端仅支持dataFrame类型

三、 Spark SQL的统一入口类

代码如下(示例):

#!/usr/bin/env python
# @desc : 
__coding__ = "utf-8"
__author__ = "itcast team"

from pyspark import SparkContext, SparkConf
import os

# 锁定远端操作环境, 避免存在多个版本环境的问题
from pyspark.sql import SparkSession

os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"

# 快捷键:  main 回车
if __name__ == '__main__':
    print("演示: 如何构建SparkSession对象")

    # 1. 创建SparkSession对象
    spark = SparkSession.builder.master('local[*]').appName('init').getOrCreate();
    
    # 获取原有的SparkContext对象
    sc = spark.sparkContext
   
    # 释放资源
    sc.stop()
    spark.stop()

入门案例
stu_score.txt

1 语文 99
2 语文 99
3 语文 99
4 语文 99
5 语文 99
6 语文 99
7 语文 99
8 语文 99
9 语文 99
10 语文 99
11 语文 99
12 语文 99
13 语文 99
14 语文 99
15 语文 99
#!/usr/bin/env python
# @desc :
__coding__ = "utf-8"
__author__ = "itcast team"

from pyspark import SparkContext, SparkConf
import os

# 锁定远端操作环境, 避免存在多个版本环境的问题
from pyspark.sql import SparkSession

os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"
# 快捷键: main 回车
if __name__ == '__main__':
    spark = SparkSession.builder.appName("test").master("local[*]").getOrCreate()

    sc = spark.sparkContext

    df = spark.read.csv("file:///export/data/workspace/ky07_spark_parent/_03_spark_sql/data/stu_score.txt",sep = " ", header=False)
    df2 = df.toDF("id", "name", "score")
    df2.printSchema()

    df2.createTempView("score")
    spark.sql("""
        select * from score where name='语文' limit 5""").show()

结果如下
在这里插入图片描述

四、 DataFrame基本介绍

在这里插入图片描述
一个dataFrame表示是一个二维的表, 一个二维表, 必然存在 行 列 表结构描述信息

表结构描述信息(元数据): StructType
字段: StructField
定义: 字段的名称, 字段的类型, 字段是否可以为null

认为: 在一个StructType对象下, 是由多个StructField组成的, 构建了一个完整的元数据信息

行: ROW对象

列: Column对象

注意: dataFrame本质上就是一个RDD, 只是对RDD进行包装, 在其基础上添加Schema元数据信息, 从而处理结构化数据

五、dataFrame的相关API

操作dataFrame一般有二种操作的方式, 一种为SQL方式, 另一种为DSL方式

SQL方式: 通过编写SQL语句完成统计分析操作

DSL方式: 领域特定语言  指的通过DF的特有API完成计算操作(通过代码形式)

从使用角度来看:  SQL可能更加的方便一些,  当适应DSL写法后, 你会发现DSL要比SQL更加好用(类似于面向过程编程)

Spark的官方角度: 推荐使用DSL方案

关于DSL相关的API:

  • show(参数1,参数2): 用于展示DF中的数据, 默认仅展示前20行

    • 参数1: 默认是20, 控制展示多少行
    • 参数2: 是否阶段列, 默认只输出20个字符的长度, 过长不显示, 要显示的话, 请输入: truncate=True
    • 一般这两个参数很少会设置
  • printSchema(): 用于打印当前这个df的表结构信息

  • select() 类似于SQL语句中select, SQL中select后面可以写啥, API也是同样可以实现的

  • filter/where(): 用于对数据进行过滤操作, 一般在Spark SQL中主要使用where

  • groupBy() 用于执行分组

  • orderBy() 用于执行排序

  • ……

注意: 
	Spark SQL的DSL API 都是非常简单的, 基本上与SQL的关键词保持一致, 一般大家认为DSL比较难的地址: 不知道该如何传递参数, 因为DSL API的参数变化多样, 每个函数支持的参数方式也不一样
	
	DSL主要支持以下几种传递的方式: 列表 | str | column
		str格式:  '字段'
		column对象: 
			df对象中包含的字段:  df['字段']
			执行过程中新产生的字段: F.col('字段')
		列表:
			['字段1','字段2','字段3'...]
			[column1,column2,column3...]
	
	如何识别对应的API支持哪几种传递方式呢?
	

总结

Spark可以使用标准SQL语言, 也可以使用代码. 同时支持混合使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值