2024 .1.7 Day05_Spark_HomeWork; Spark_SQL

目录

[1. 简述Spark SQL与HIVE的对比](#1. 简述Spark SQL与HIVE的对比)

[2. Spark SQL是什么?](#2. Spark SQL是什么?)

3.代码题

[需求1 直接基于DataFrame来处理,完成SparkSQL版的WordCount词频统计。DSL和SQL两种方式都要实现](#需求1 直接基于DataFrame来处理,完成SparkSQL版的WordCount词频统计。DSL和SQL两种方式都要实现)

[4.创建Spark DataFrame的几种方式?](#4.创建Spark DataFrame的几种方式?)

[5. 创建得到DataFrame的方式有哪些,各自适用场景是怎么样的?](#5. 创建得到DataFrame的方式有哪些,各自适用场景是怎么样的?)

[3.1 text方式读取:](#3.1 text方式读取:)

[3.2 CSV方式读取:](#3.2 CSV方式读取:)

[3.3 JSON读取数据:](#3.3 JSON读取数据:)


1. 简述Spark SQL与HIVE的对比

相同点:

1.都是分布式SQL计算引擎

2.都可以处理大规模的结构化数据

3.都可以建立在YARN集群之上运行

不同点:

  1. Sparksql是基于内存计算 , Hivesql底层是运行在Mr上,也就是基于磁盘进行计算

  2. sparksql没有元数据管理服务, hivesql是有metastore元数据管理服务的

  3. Sparksql底层执行RDD程序 , HIVEsql底层执行MapReduce

  4. Sparksql可以编写sql也可以编写代码, HIVEsql只能编写sql

2. Spark SQL是什么?

SparkSQL是建立在Spark上的一个工具模块,用于处理结构化的数据

3.代码题

需求1 直接基于DataFrame来处理,完成SparkSQL版的WordCount词频统计。DSL和SQL两种方式都要实现

测试数据: hello spark hadoop hive oozie sqoop hello hive hadoop java java python hadoop hive hadoop

python 复制代码
import os
from pyspark import SparkConf, SparkContext
from pyspark.sql import SparkSession
import pyspark.sql.functions as F

# 绑定指定的Python解释器
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'
# 绑定指定的Python解释器
from pyspark.sql.types import StructType, IntegerType, StringType, StructField

if __name__ == '__main__':
# 1- 创建SparkSession对象
    spark = SparkSession.builder\
        .appName('需求1词频统计')\
        .master('local[*]')\
        .getOrCreate()
# 2- 数据输入
    init_df = spark.read.text(
        paths='hdfs://node1:8020/input/day05_home_work.txt'
    )
    # 创建侧视图
    init_df.createTempView('words')
python 复制代码
# 3- 数据处理
    print("SQL方式进行词频统计")
    spark.sql("""
    select word,count(1)as cnt 
    from
        (select explode(split(value,' ')) as word 
        from words)
        group by word
        order by cnt desc 
    """).show()
    '''
+------+---+
|  word|cnt|
+------+---+
|hadoop|  4|
|  hive|  3|
| hello|  2|
|  java|  2|
| spark|  1|
| oozie|  1|
| sqoop|  1|
|python|  1|
+------+---+
'''
    print('DSL方式实现词频统计')
    init_df.select(
        F.explode(F.split('value',' ')).alias('word')
    ).groupby('word').agg(
        F.count('word').alias('cnt'),
    ).orderBy('cnt',ascending=False).show()

    '''
    +------+---+
    |  word|cnt|
    +------+---+
    |hadoop|  4|
    |  hive|  3|
    |  java|  2|
    | hello|  2|
    | sqoop|  1|
    | spark|  1|
    |python|  1|
    | oozie|  1|
    +------+---+
    '''

# 4- 数据输出

# 5- 释放资源
    spark.stop()

4.创建Spark DataFrame的几种方式?

1 . 通过RDD得到DataFrame

  1. 内部初始化数据得到DataFrame

  2. 读取外部文件得到DataFrame

5. 创建得到DataFrame的方式有哪些,各自适用场景是怎么样的?

1 . RDD转DataFrame , 场景 : RDD可以存储任意结构的数据类型,而DataFrame只能存储二维表结构化数据, 在使用Spark处理数据的初期,可能输入进来的数据是半结构化或者非结构化的,那么可以先通过RDD对数据进行ETL处理成结构化数据,再使用开发高效率的SparkSQL进行后续数据处理;

  1. 内部初始化数据得到DataFrame , 通过createDataFrame创建DataFrame , 一般用在开发和测试中.因为只能处理少量的数据

  2. 读取外部文件得到DataFrame , Text方式\CSV方式\JSON方式 ;

3.1 text方式读取:

不管文件内容如何,会将所有内容放到一个列中;

默认生成的列名叫做value,数据类型String;并且只能修改value的名称,其他内容无法修改;

3.2 CSV方式读取:

常设置的参数

path:指定文件路径,本地或者hdfs

schema:手动指定元数据信息

sep:指定字段间的分隔符

encoding:指定文件的编码方式

header:指定文件中的第一行是否是字段名称

inferSchema:根据数据内容自动推断数据类型。但是,推断结果可能不精确

3.3 JSON读取数据:

需要手动指定schema信息.如果手动指定的时候,名称字段与json中的key名称不一致,会解析不成功, 以null值填充

csv/json中schema的结构,如果是字符串类型,那么字段名称和字段数据类型间,只能以空格分隔

相关推荐
爬山算法2 小时前
Redis(162)如何使用Redis实现消息队列?
数据库·redis·缓存
郑州光合科技余经理2 小时前
同城系统海外版:一站式多语种O2O系统源码
java·开发语言·git·mysql·uni-app·go·phpstorm
u***32432 小时前
【Redis】centos7 systemctl 启动 Redis 失败
数据库·redis·缓存
一只乔哇噻2 小时前
java后端工程师+AI大模型开发进修ing(研一版‖day60)
java·开发语言·人工智能·学习·语言模型
LNN20222 小时前
Linuxfb+Qt 输入设备踩坑记:解决 “节点存在却无法读取“ 问题
开发语言·qt
千里码aicood2 小时前
计算机大数据、人工智能与智能系统开发定制开发
大数据·人工智能·深度学习·决策树·机器学习·森林树
煎蛋学姐2 小时前
SSM社区生鲜电商平台dq96z(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·用户管理·ssm 框架·社区生鲜电商·商品信息管理
杨云龙UP2 小时前
从0搭建Oracle ODA NFS异地备份:从YUM源到RMAN定时任务的全流程
linux·运维·数据库·oracle
倔强的石头_3 小时前
从 Oracle 到 KingbaseES:破解迁移痛点,解锁信创时代数据库新可能
数据库
踢足球09293 小时前
Redis的典型应用
数据库·redis·缓存