SparkSQL

1.Hive:

表的类型:内部表、外部表、临时表、分区表(动态、静态)分桶表

创建各种表的关键字:
外部表:external
临时表:TEMPORARY
分区表:partitioned by (dt string)
分桶表:CLUSTERED BY



2.SparkSQL:

Hive依赖于HDFS和MR,而SparkSQL依赖有HDFS和Spark core

2.1.Shark:

Shark是SparkSQL的最开始的一个版本,后来改名为SparkSQL。

Shark是基于Spark计算框架之上且兼容Hive语法的SQL执行引擎,由于底层的计算采用了Spark,性能比MR的Hive普遍快2倍。(Spark如果基于磁盘的话,比MR快10倍以上,基于内存的话,快100倍以上)当数据全部load在内存的话,将快10倍以上,因此Shark可以作为交互式查询应用服务来使用。

除了基于Spark的特性外,Shark是完全兼容Hive的语法,表结构以及UDF函数等,已有的HiveSql可以直接进行迁移至Shark上

Shark底层依赖于Hive的解析器,查询优化器,但正是由于SHark的整体设计架构对Hive的依赖性太强,难以支持其长远发展,比如不能和Spark的其他组件进行很好的集成,无法满足Spark的一栈式解决大数据处理的需求

当有一个sql语句传给Shark,它底层的解析器,查询优化器把sql解析成一个个Spark任务,底层的解析器,优化器都是HIive的

2.2Spark官网:http://spark.apache.org/

2.2.1官网信息

速度:
在这里插入图片描述
时间对比图:
在这里插入图片描述
Spark生态圈:在这里插入图片描述
2.2.2运行过程:
在这里插入图片描述
SparkSQL:
优点:底层的解析器,优化器都是自己的。

2.2.3产生关系:

Hive是Shark的前身,Shark是SparkSQL的前身

相对于Shark,SparkSQL有什么优势呢?

1.SparkSQL产生的根本原因,其完全脱离了Hive的限制

2.SparkSQL支持查询原生的RDD,这点就极为关键了。RDD是Spark平台的核心概念,是Spark能够高效的处理大数据的各种场景的基础

3.能够在Scala中写SQL语句。支持简单的SQL语法检查,能够在Scala中写Hive语句访问Hive数据,并将结果取回作为RDD使用

2.2.4最近新出的组合名称:

SparkSQL on Hive:(常用)
Hive只是作为了存储的角色
SparkSQL作为计算的角色

Hive on Spark:
Hive承担了一部分计算(解析SQL,优化SQL…)的和存储
Spark作为了执行引擎的角色

3.DataFrame:

3.1DataFrame介绍:

与RDD类似,DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表格,除了数据以外,还掌握数据的结构信息,即schema。同时,与Hive类似,DataFrame也支持嵌套数据类型(struct、array和map)。从API易用性的角度上 看,DataFrame API提供的是一套高层的关系操作,比函数式的RDD API要更加友好,门槛更低

在SparkSQL中,一切计算都基于DataFrame.。DataFrame底层封装的是 RDD,SparkSQL底层封装的是SparkCore.DataFrame可以理解为二维表

3.2RDD vs DataFrame
在这里插入图片描述
对于一个RDD,想要拿到每个Person对象的Name值:需要一条条的遍历,把对象放在内存中,再去解析拿到想到的属性,会产生冗余数据(还有其他属性的存在,极大的占用了内存)
而对于DataFrame,是有行有列的。当想拿到哪个属性时,直接拿出相应的列即可。

3.3SprkSQL所能接收的数据源:

在这里插入图片描述

3.4SparkSQL的底层架构:
在这里插入图片描述

### Spark SQL 使用指南 #### 创 SparkSession Spark 中的所有功能都由 `SparkSession` 类作为入口点。以下是创一个基础的 `SparkSession` 的方法: ```scala import org.apache.spark.sql.SparkSession val spark = SparkSession .builder() .appName("Spark SQL Example") .config("spark.some.config.option", "some-value") .getOrCreate() // 隐式转换支持,例如将 RDD 转换为 DataFrame import spark.implicits._ ``` 上述代码展示了如何初始化一个 `SparkSession` 实例并配置其名称和选项[^1]。 --- #### 处理 Datasets 和 DataFrames 在 Spark SQL 中,`DataFrame` 是一种分布式的数据结构,类似于关系型数据库中的表。可以通过多种方式加载数据到 DataFrame 或 Dataset 中。以下是一个简单的例子,展示如何读取 CSV 文件并执行查询: ```scala // 加载 CSV 数据 val df = spark.read.format("csv").option("header", "true").load("path/to/csv") // 显示前几行数据 df.show() // 执行简单过滤操作 val filteredDF = df.filter($"age" > 20) // 注册临时视图以便使用 SQL 查询 filteredDF.createOrReplaceTempView("people") // 运行 SQL 查询 val result = spark.sql("SELECT * FROM people WHERE age > 30") result.show() ``` 此部分演示了如何加载外部数据源、应用过滤器以及运行 SQL 查询[^2]。 --- #### 日期时间转换 在实际场景中,经常需要对日期和时间字段进行处理。Spark SQL 提供了一系列内置函数来简化这一过程。常用的函数包括但不限于以下几个: - **to_date**: 将字符串转换为日期类型。 - **to_timestamp**: 将字符串转换为时间戳类型。 - **date_format**: 格式化日期或时间戳。 - **datediff**: 计算两个日期之间的天数差。 下面是一些具体的用法示例: ```sql -- 假设有一个名为 events 的表,其中包含 timestamp 字段 SELECT to_date(timestamp, 'yyyy-MM-dd') AS date_col, to_timestamp(timestamp, 'yyyy-MM-dd HH:mm:ss') AS ts_col, date_format(to_date(timestamp), 'MM/dd/yyyy') AS formatted_date, datediff(current_date(), to_date(timestamp)) AS days_diff FROM events; ``` 这段代码说明了如何利用 Spark SQL 函数完成常见的日期时间转换任务[^3]。 --- #### 控制输出文件数量 当写入大数据集时,默认情况下可能会生成大量小型文件。为了优化性能和管理方便,可以使用合并提示(merge hints),这使得用户能够像在 Dataset API 中那样控制输出分区的数量。具体实现如下所示: ```scala // 合并分区以减少输出文件数量 val repartitionedDF = df.repartition(10) // 设置为 10 个分区 // 写入结果到 HDFS 或其他存储系统 repartitionedDF.write.mode("overwrite").parquet("output/path") ``` 这种方法有助于提高下游系统的效率,并减少了不必要的小文件开销[^4]。 --- ### 总结 以上内容涵盖了 Spark SQL 的核心概念及其典型应用场景,包括创 `SparkSession`、处理 Datasets/DataFrames、日期时间转换以及调整输出文件大小等方面的知识点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值