Spark
文章平均质量分 83
Spark
优惠券已抵扣
余额抵扣
还需支付
¥19.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
shangjg3
这个作者很懒,什么都没留下…
展开
-
SparkSQL项目实战
我们这次Spark-sql操作所有的数据均来自Hive,首先在Hive中创建表,并导入数据。一共有3张表:1张用户行为表,1张城市表,1张产品表。查询出来所有的点击记录,并与city_info表连接,得到每个城市所在的地区,与 Product_info表连接得到。的维度来看的,计算各个区域前三大热门商品,并备注上每个商品在主要城市中的分布比例,超过两个城市用其他显示。北京21.2%,天津13.2%,其他65.6%北京63.0%,太原10%,其他27.0%北京63.0%,太原10%,其他27.0%原创 2023-11-16 03:45:00 · 428 阅读 · 0 评论 -
SparkSQL数据的加载与保存
SparkSQL读取和保存的文件一般为三种,JSON文件、CSV文件和列式存储的文件,同时可以通过添加参数,来识别不同的存储和压缩格式。原创 2023-11-15 04:00:00 · 635 阅读 · 0 评论 -
Spark SQL编程
1.Spark SQL概述1.1 什么是Spark SQLSpark SQL是用于结构化数据处理的Spark模块。与基本的Spark RDD API不同,Spark SQL提供的接口为Spark提供了有关数据结构和正在执行的计算的更多信息。在内部,Spark SQL使用这些额外的信息来执行额外的优化。与Spark SQL交互的方式有多种,包括SQL和Dataset API。计算结果时,使用相同的执行引擎,与您用于表达计算的API/语言无关。1.2 为什么要有Spark SQL1.3 Spark。原创 2023-11-15 03:00:00 · 464 阅读 · 0 评论 -
Spark3.0中的AOE、DPP和Hint增强
AQE 是 Spark SQL 的一种动态优化机制,在运行时,每当 Shuffle Map 阶段执行完毕,AQE 都会结合这个阶段的统计信息,基于既定的规则动态地调整、修正尚未执行的逻辑计划和物理计划,来完成对原始查询语句的运行时优化。(2)如果分区太多,则每个分区的数据量大小可能很小,读取大量小的网络数据块,这也会导致I/O效率低而降低了查询速度。(1)如果分区太少,则每个分区的数据量可能会很大,处理这些数据量非常大的分区,可能需要将数据溢写到磁盘(例如,排序和聚合),降低了查询。原创 2023-11-14 04:00:00 · 598 阅读 · 0 评论 -
Spark数据倾斜优化
数据倾斜一般是发生在shuffle类的算子,比如distinct、groupByKey、reduceByKey、aggregateByKey、join、cogroup等,涉及到数据重分区,如果其中某一个key数量特别大,就发生了数据倾斜。原创 2023-11-14 03:15:00 · 528 阅读 · 0 评论 -
Spark 资源调优
以单台服务器128G内存,32线程为例。先设定单个Executor核数,根据Yarn配置得出每个节点最多的Executor数量,每个节点的yarn内存/每个节点数量=单个节点的数量总的executor数=单节点数量*节点数。原创 2023-11-13 04:00:00 · 291 阅读 · 0 评论 -
Spark Job优化
map-side预聚合,就是在每个节点本地对相同的key进行一次聚合操作,类似于MapReduce中的本地combiner。map-side预聚合之后,每个节点本地就只会有一条相同的key,因为多条相同的key都被聚合起来了。其他节点在拉取所有节点上的相同key时,就会大大减少需要拉取的数据数量,从而也就减少了磁盘IO以及网络传输开销。原创 2023-11-13 03:15:00 · 174 阅读 · 0 评论 -
SparkSQL语法优化
SparkSQL在整个执行计划处理的过程中使用了Catalyst优化器。1。原创 2023-11-12 04:00:00 · 891 阅读 · 0 评论 -
Spark的执行计划
Spark SQL 取代 Spark Core,成为新一代的引擎内核,所有其他子框架如 Mllib、Streaming 和 Graph,都可以共享 Spark SQL 的性能优化,都能从 Spark 社区对于 Spark SQL 的投入中受益。发现SQL执行慢的根本原因,才能知道应该在哪儿进行优化,是调整SQL的编写方式、还是用Hint、还是调参,而不是把优化方案拿来试一遍。explain(mode="formatted"):以分隔的方式输出,它会输出更易读的物理执行计划,并展示每个节点的详细信息。原创 2023-11-12 03:15:00 · 508 阅读 · 0 评论 -
Spark的转换算子和操作算子
当某个RDD执行map方法时,会遍历该RDD中的每一个数据项,并依次应用f函数,从而产生一个新的RDD。当某个RDD调用filter方法时,会对该RDD中每一个元素应用f函数,如果返回值类型为true,则该元素会被添加到新的RDD中。排序后新产生的RDD的分区数与原RDD的分区数一致。区别:在flatMap操作中,f函数的返回值是一个集合,并且会将每一个该集合中的元素拆分出来放到新的RDD中。在一个(K,V)的RDD上调用,K必须实现Ordered接口,返回一个按照key进行排序的(K,V)的RDD。原创 2023-11-11 17:44:52 · 916 阅读 · 0 评论 -
Scala 泛型编程
之所以在日常的编程中之所以你能够执行 `3>2` 这样的判断操作,是因为程序执行了定义在 `Predef` 中的隐式转换方法 `intWrapper(x: Int) `,将 Int 类型转换为 RichInt 类型,而 RichInt 间接混入了 Ordered 特质,所以能够进行比较。上下文界定的形式为 `T:M`,其中 M 是一个泛型,它要求必须存在一个类型为 M[T]的隐式值,当你声明一个带隐式参数的方法时,需要定义一个隐式默认值。当对象自身并没有定义比较规则的时候,可以传入外部比较器进行比较。原创 2023-11-02 17:11:19 · 483 阅读 · 0 评论 -
Scala中类的继承、抽象类和特质
继承。原创 2023-11-02 16:46:38 · 489 阅读 · 0 评论 -
Scala的类和对象
示例代码中 `person.age=30` 在执行时内部实际是调用了方法 `person.age_=(30) `,而 `person.age` 内部执行时实际是调用了 `person.age()` 方法。在上面的例子中可以看到我们是使用 `.` 来对成员变量进行访问的,如果想要额外生成和 Java 中一样的 getXXX 和 setXXX 方法,则需要使用@BeanProperty 进行注解。写在主构造器中的代码块会在类初始化的时候被执行,功能类似于 Java 的静态代码块 `static{}`原创 2023-11-01 10:50:10 · 277 阅读 · 0 评论 -
Scala函数和闭包
从上面的示例可以看出重新声明 more 后,全局的 more 的值是 100,但是对于闭包函数 addMore10 还是引用的是值为 10 的 more,这是由虚拟机来实现的,虚拟机会保证 more 变量在重新声明后,原来的被捕获的变量副本继续在堆上保持存活。Scala 中函数与方法的区别非常小,如果函数作为某个对象的成员,这样的函数被称为方法,否则就是一个正常的函数。x: 是一个绑定变量 (bound variable),因为其是该函数的入参,在函数的上下文中有明确的定义;原创 2023-11-01 10:24:05 · 297 阅读 · 0 评论 -
Scala集合操作
即遍历元素,直到遇到第一个不符合条件的值则结束遍历,将遍历到的值和未遍历到的值分别放入两个集合返回。一个包含 xs 和 ys 中所有元素的新的集合。对集合执行更改,添加或删除操作都会返回一个新的集合,而不是修改原来的集合。从第一个元素开始查找满足条件 p 的元素, 直到遇到一个不满足条件的元素,返回所有未遍历到的值。返回给定索引范围之内的元素组成的集合 (包含 from 位置的元素但不包含 to 位置的元素)从第一个元素开始查找满足条件 p 的元素, 直到遇到一个不满足条件的元素,返回所有遍历到的值。原创 2023-10-31 14:49:32 · 213 阅读 · 0 评论 -
Scala 数组(Array)、列表(List)、集合(Set)、映射(Map)和元组(Tuple)
在 Scala 中,如果你需要一个长度不变的数组,可以使用 Array。但需要注意以下两点:- 在 Scala 中使用 (index) 而不是 [index] 来访问数组中的元素,因为访问元素,对于 Scala 来说是方法调用,(index) 相当于执行了 .apply(index) 方法。- Scala 中的数组与 Java 中的是等价的,Array[Int]() 在虚拟机层面就等价于 Java 的 int[]。原创 2023-10-31 11:25:41 · 221 阅读 · 0 评论 -
Scala 流程控制语句
如果需要从控制台中获取输入,则可以使用 `StdIn` 中定义的各种方法。Scala 中的 if/else 语法结构与 Java 中的一样,唯一不同的是,Scala 中的 if 表达式是有返回值的。Scala 中每个分支语句后面不需要写 break,因为在 case 语句中 break 是隐含的,默认就有;在 Scala 中 match 语句是有返回值的,而 Java 中 switch 语句是没有返回值的。在 Scala 中,可以使用 `{}` 块包含一系列表达式,块中最后一个表达式的值就是块的值。原创 2023-10-31 10:47:03 · 179 阅读 · 0 评论 -
Scala基本数据类型和运算符
1.数据类型1.1 类型支持Scala 拥有下表所示的数据类型,其中 Byte、Short、Int、Long 和 Char 类型统称为整数类型,整数类型加上 Float 和 Double 统称为数值类型。Scala 数值类型的取值范围和 Java 对应类型的取值范围相同。数据类型描述Byte8 位有符号补码整数。数值区间为 -128 到 127Short16 位有符号补码整数。数值区间为 -32768 到 32767Int32 位有符号补码整数。原创 2023-10-30 17:20:23 · 207 阅读 · 0 评论 -
Scala简介及开发环境配置
Scala 拥有非常先进的静态类型系统,Scala 不仅拥有与 Java 类似的允许嵌套类的类型系统,还支持使用泛型对类型进行参数化,用交集(intersection)来组合类型,以及使用抽象类型来进行隐藏类型的细节。此时看到 `Scala SDK` 为空,依次点击 `Create` => `Download` ,选择所需的版本后,点击 `OK` 按钮进行下载,下载完成点击 `Finish` 进入工程。Scala 不只是一门纯的面对对象的语言,它也是功能完整的函数式编程语言。即方法不应该有副作用。原创 2023-10-30 02:45:00 · 140 阅读 · 0 评论 -
Spark Structured API基本使用
Spark 中所有功能的入口点是 `SparkSession`,可以使用 `SparkSession.builder()` 创建。上面使用 `createOrReplaceTempView` 创建的是会话临时视图,它的生命周期仅限于会话范围,会随会话的结束而结束。Spark 支持多种方法来构造和引用列,最简单的是使用 `col() ` 或 `column() ` 函数。需要说明的是新增,删除,重命名列都会产生新的 DataFrame,原来的 DataFrame 不会被改变。1.1 创建DataFrame。原创 2023-10-19 10:22:54 · 228 阅读 · 0 评论 -
Spark Streaming 整合 Kafka
同时从输出中也可以看到在程序中指定的 `groupId` 和程序自动分配的 `clientId`。在示例代码中 `kafkaParams` 封装了 Kafka 消费者的属性,这些属性和 Spark Streaming 无关,是 Kafka 原生 API 中就有定义的。在示例代码中,我们实际上并没有指定第三个参数 `offsets`,所以程序默认采用的是配置的 `auto.offset.reset` 属性的值 latest,即在偏移量无效的情况下,消费者将从其启动之后生成的最新的记录开始读取数据。原创 2023-10-19 10:10:00 · 873 阅读 · 0 评论 -
Spark Streaming 整合 Flume
因为 Spark 安装目录下是不含有 `spark-streaming-flume` 依赖包的,所以在提交到集群运行时候必须提供该依赖包,你可以在提交命令中使用 `--jar` 指定上传到服务器的该依赖包,或者使用 `--packages org.apache.spark:spark-streaming-flume_2.12:2.4.3` 指定依赖包的完整名称,这样程序在启动时会先去中央仓库进行下载。这种方式是基于事务的,即只有在 Spark Streaming 接收和复制数据完成后,才会删除缓存的数据。原创 2023-10-18 17:41:46 · 725 阅读 · 0 评论 -
Spark Streaming与流处理
流处理更贴近现实的数据模型:在实际的环境中,一切数据都是持续变化的,要想能够通过过去的数据推断未来的趋势,必须保证数据的不断输入和模型的不断修正,典型的就是金融市场、股票市场,流处理能更好的应对这些数据的连续性的特征和及时性的需求;流处理可以处理更大的数据量:直接处理数据流,并且只保留数据中有意义的子集,并将其传送到下一个处理单元,逐级过滤数据,降低需要处理的数据量,从而能够承受更大的数据量;大多数数据都是连续的流:传感器事件,网站上的用户活动,金融交易等等 ,所有这些数据都是随着时间的推移而创建的。原创 2023-10-09 01:00:00 · 91 阅读 · 0 评论 -
Spark Streaming 基本操作
在内部,DStream 由一系列连续的 RDD 表示。这里可以看到一共使用了三次循环,分别是循环 RDD,循环分区,循环每条记录,上面我们的代码是在循环分区的时候获取连接,也就是为每一个分区获取一个连接。使用 `updateStateByKey` 算子,你必须使用 `ssc.checkpoint()` 设置检查点,这样当使用 `updateStateByKey` 算子时,它会去检查点中取出上一次保存的信息,并使用自定义的 `updateFunction` 函数将上一次的数据和本次数据进行相加,然后返回。原创 2023-10-08 07:30:00 · 113 阅读 · 0 评论 -
Spark 弹性分布式数据集 RDD
RDD(s) 及其之间的依赖关系组成了 DAG(有向无环图),DAG 定义了这些 RDD(s) 之间的 Lineage(血统) 关系,通过血统关系,如果一个 RDD 的部分或者全部计算结果丢失了,也可以重新进行计算。对于一个 HDFS 文件来说,这个列表保存的就是每个分区所在的块的位置,按照“移动数据不如移动计算“的理念,Spark 在进行任务调度的时候,会尽可能的将计算任务分配到其所要处理数据块的存储位置。如果内存空间不够,将未缓存的分区数据存储到磁盘,在需要使用这些分区时从磁盘读取。原创 2023-10-08 07:00:00 · 345 阅读 · 0 评论 -
SparkSQL外部数据源
执行结果如下:`help_keyword` 这张表只有 600 条左右的数据,本来数据应该均匀分布在 10 个分区,但是 0 分区里面却有 319 条数据,这是因为设置了下限,所有小于 300 的数据都会被限制在第一个分区,即 0 分区。同时数据文件也不能过大,否则在查询时会有不必要的性能开销,因此要把文件大小控制在一个合理的范围内。Parquet 是一个开源的面向列的数据存储,它提供了多种存储优化,允许读取单独的列非整个文件,这不仅节省了存储空间而且提升了读取效率,它是 Spark 是默认的文件格式。原创 2023-10-07 07:58:52 · 993 阅读 · 0 评论 -
SparkSQL 查询连接操作
而对于大表和小表的连接操作,Spark 会在一定程度上进行优化,如果小表的数据量小于 Worker Node 的内存空间,Spark 会考虑将小表的数据广播到每一个 Worker Node,在每个工作节点内部执行连接计算,这可以降低网络的 IO,但会加大每个 Worker Node 的 CPU 负担。在对大表与大表之间进行连接操作时,通常都会触发 `Shuffle Join`,两表的所有分区节点会进行 `All-to-All` 的通讯,这种查询通常比较昂贵,会对网络 IO 会造成比较大的负担。原创 2023-10-07 07:58:09 · 264 阅读 · 0 评论 -
SparkSQL常用聚合函数
通常在使用大型数据集时,你可能关注的只是近似值而不是准确值,这时可以使用 approx_count_distinct 函数,并可以使用第二个参数指定最大允许误差。以下分别使用两种方式来自定义一个求平均值的聚合函数,这里以计算员工平均工资为例。- 无类型的自定义聚合函数,主要适用于 DataFrame。- 有类型的自定义聚合函数,主要适用于 DataSet;求和以及求指定列所有不相同的值的和。3.2 无类型的自定义聚合函数。3.1 有类型的自定义函数。1.10 聚合数据到集合。内置的求平均数的函数。原创 2023-10-06 10:45:00 · 179 阅读 · 0 评论 -
SparkSQL DataFrame、Dataset和RDD
DataFrame 的 `Untyped` 是相对于语言或 API 层面而言,它确实有明确的 Scheme 结构,即列名,列类型都是确定的,但这些信息完全由 Spark 来维护,Spark 只会在运行时检查这些类型和指定类型是否一致。在 Spark 2.0 后,为了方便开发者,Spark 将 DataFrame 和 Dataset 的 API 融合到一起,提供了结构化的 API(Structured API),即用户可以通过一套标准的 API 就能完成对两者的操作。原创 2023-10-06 10:30:00 · 109 阅读 · 0 评论 -
Spark部署模式与作业提交
这时候可以查看 Web UI,我这里是内存空间不足:提交命令中要求作业的 `executor-memory` 是 2G,但是实际的工作节点的 `Memory` 只有 1G,这时候你可以修改 `--executor-memory`,也可以修改 Woker 的 `Memory`,其默认值为主机所有可用内存值减去 1G。需要注意的是:在集群环境下,`application-jar` 必须能被集群中所有节点都能访问,可以是 HDFS 上的路径;首先需要保证 Spark 已经解压在两台主机的相同路径上。原创 2023-10-05 04:00:00 · 312 阅读 · 0 评论 -
Spark 3.3.2 离线安装
2.1. 下载spark 和scala 已编译tar包。2.3修改 spark-defaults.conf配置。2.4修改spark-env.sh配置。原创 2023-08-03 16:21:54 · 168 阅读 · 0 评论