- 博客(51)
- 收藏
- 关注
原创 不分组求top N
使用子查询和 LIMIT 子句SELECT(SELECT DISTINCTSalaryFROMEmployeeORDER BY Salary DESCLIMIT 1 OFFSET 1) AS SecondHighestSalary;使用 IFNULL 和 LIMIT 子句SELECT IFNULL( (SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMI
2022-03-02 10:17:21
200
原创 Hive行转列函数与列转行函数
行转列concat(string,string……):字符串连接concat_ws(参数1,string,string……):参数1是分隔符,按分隔符分隔连接字符串collect_set(字段名):将字段的值去重,产生array类型字段列转行Explode(字段名):将某列中的array或map拆分成多行Split(字段名,分隔符):根据分隔符来切分某字段元素Lateral view:写在split,explode等UDTF前,将一列数据拆成多行,再聚合...
2022-02-24 10:11:38
929
原创 Hive中常用的系统函数
常用日期函数unix_timestamp:返回当前或指定时间的时间戳 select unix_timestamp();select unix_timestamp(“2020-10-28”,‘yyyy-MM-dd’);from_unixtime:将时间戳转为日期格式select from_unixtime(1603843200);current_date:当前日期select current_date;current_timestamp:当前的日期加时间select current_time
2022-02-16 11:31:39
218
原创 Hive的数据文件存储格式
1、TEXTFILEHive数据表的默认格式,存储方式:行存储。可以使用Gzip压缩算法,但压缩后的文件不支持split在反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此反序列化开销会比SequenceFile高几十倍。2、SEQUENCEFILE压缩数据文件可以节省磁盘空间,但Hadoop中有些原生压缩文件的缺点之一就是不支持分割。支持分割的文件可以并行的有多个mapper程序处理大数据文件,大多数文件不支持可分割是因为这些文件只能从头开始读。Sequence File是可分割的文件
2022-02-09 19:23:13
3105
原创 YARN 的任务提交流程
当JobClient向YARN提交一个应用程序后,YARN将分两个阶段运行这个应用程序:一是启动ApplicationMaster;第二个阶段是由ApplicationMaster创建应用程序,为它申请资源,监控运行直到结束。具体步骤如下:1、用户向YARN提交一个应用程序,并指定ApplicationMaster程序、启动ApplicationMaster的命令、用户程序。2、 RM为这个应用程序分配第一个Container,并与之对应的NM通讯,要求它在这个Container中启动应用程序Appl
2022-02-02 10:13:56
2653
原创 java不重复随机数组生成
ArrayList<Integer> numList = new ArrayList<>(); Random random = new Random (); int i=0; while (i<lists.size()) { int randInt = random.nextInt(lists.size()); if (numList.contains(randInt))...
2022-01-26 11:10:12
198
原创 维度建模步骤
维度建模一般按照以下四个步骤:选择业务过程→声明粒度→确认维度→确认事实(1)选择业务过程在业务系统中,挑选我们感兴趣的业务线,比如下单业务,支付业务,退款业务,物流业务,一条业务线对应一张事实表。(2)声明粒度数据粒度指数据仓库的数据中保存数据的细化程度或综合程度的级别。声明粒度意味着精确定义事实表中的一行数据表示什么,应该尽可能选择最小粒度,以此来应各种各样的需求。典型的粒度声明如下:订单事实表中一行数据表示的是一个订单中的一个商品项。支付事实表中一行数据表示的是一个支付记录。(3)
2022-01-19 10:07:34
9934
原创 Zookeeper在Kafka中的作用
Kafka使用zk的分布式协调服务,将生产者,消费者,消息储存(broker,用于存储信息,消息读写等)结合在一起。同时借助zk,kafka能够将生产者,消费者和broker在内的所有组件在无状态的条件下建立起生产者和消费者的订阅关系,实现生产者的负载均衡。1.broker在zk中注册kafka的每个broker(相当于一个节点,相当于一个机器)在启动时,都会在zk中注册,告诉zk其brokerid,在整个的集群中,broker.id/brokers/ids,当节点失效时,zk就会删除该节点,就很方便的
2022-01-05 11:24:11
478
原创 Kafka消费者分区分配策略
Range范围分区是Kafka中默认的分区分配策略,Kafka提供了消费者客户端参数partition.assignment.strategy用来设置消费者与订阅主题之间的分区分配策略。默认情况下,此参数的值为:org.apache.kafka.clients.consumer.RangeAssignor,即采用RangeAssignor分配策略。除此之外,Kafka中还提供了分配策略:RoundRobin轮询分区一、Range 范围分区假如有10个分区,3个消费者,把分区按照序号排列0,1,2,3,4
2021-12-15 10:07:47
2722
原创 Hbase的RowKey设计
1.Rowkey的唯一原则Rowkey必须在设计上保证其唯一性。由于在HBase中数据存储是Key-Value形式,若HBase中同一表插入相同Rowkey,则原先的数据会被覆盖掉(如果表的version设置为1的话),所以务必保证Rowkey的唯一性2. Rowkey的排序原则HBase的Rowkey是按照ASCII有序设计的,我们在设计Rowkey时要充分利用这点。比如视频网站上对视频的弹幕信息,这个弹幕是按照时间倒排序展示视频里,这个时候我们设计的Rowkey要和时间顺序相关。可以使用”Long
2021-12-08 10:06:33
537
原创 Hive的架构原理及组成
一、Hive架构图二、架构组成(1)、用户接口:ClientCLI(command-line interface)、JDBC/ODBC(jdbc 访问 hive)、WEBUI(浏览器访问 hive)(2)、元数据:Metastore元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、 表的类型(是否是外部表)、表的数据所在目录等;默认存储在自带的 derby 数据库中,推荐使用 MySQL 存储 Metastore(3)、Hadoop使用 HDFS 进行存
2021-12-01 10:10:56
6887
原创 OLAP、OLTP的介绍和比较
一、OLTP与OLAP数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。二、OLTP与OLAP之间的比较联机事务处理(OLTP,On-line Transaction Proce
2021-11-24 09:57:43
1579
原创 从上到下打印二叉树(三)
题目描述:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如:给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7返回其层次遍历结果:[[3],[20,9],[15,7]]算法流程:1.特例处理: 当树的根节点为空,则直接返回空列表 [] ;2.初始化: 打印结果空列表 res3.BFS 循环: 当 deque 为空时跳出;
2021-11-21 10:06:19
733
原创 从上到下打印二叉树(二)
题目描述从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如:给定二叉树: [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层次遍历结果:[[3],[9,20],[15,7]]算法流程:1.特例处理: 当根节点为空,则返回空列表 [] ;2.初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;3.BFS 循环: 当队列 queue 为空时跳出;1.新建一个临时列表
2021-11-18 18:23:20
106
原创 从上到下打印二叉树(一)
题目描述从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。算法流程:题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。BFS 通常借助 队列 的先入先出特性来实现。1.特例处理: 当树的根节点为空,则直接返回空列表 [] ;2.初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;3.BFS 循环: 当队列 queue 为空时跳出;1.出队: 队首元素出队,记为 node;2.打印: 将 no
2021-11-13 15:44:39
137
原创 Hive中的with as使用
一、介绍在我们写一些结构比较复杂的SQL语句时,可能某个子查询在多个地方有重复使用的情况,这个时候我们可以使用 with as 语句将其独立出来,极大提高SQL可读性,简化SQLwith as 也叫做子查询部分,首先定义一个sql片段,该sql片段会被整个sql语句所用到,让sql语句的可读性更高些,作为提供数据的部分,也常用在union等操作中。with as就类似于一个视图或临时表,可以用来存储一部分的sql语句作为别名,不同的是with as 属于一次性的,而且必须要和其他sql一起使用才可以!
2021-11-10 11:03:12
2560
原创 算法题-环形链表
题目描述:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。算法流程:我们定义两个指针,一快一满。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针在位置
2021-11-07 17:00:55
81
原创 Hive中的SMB(Sort-Merge-Buket) Join
SMB join (针对bucket mapjoin 的一种优化)条件1)set hive.auto.convert.sortmerge.join=true;set hive.optimize.bucketmapjoin = true;set hive.optimize.bucketmapjoin.sortedmerge = true;set hive.auto.convert.sortmerge.join.noconditionaltask=true;2) 小表的bucket数=大表bucke
2021-11-03 18:04:58
2064
原创 两个链表的第一个公共节点
题目描述:输入两个链表,找出它们的第一个公共节点。算法流程:构建两个节点指针 A , B 分别指向两链表头节点 headA , headB ,做如下操作:指针 A 先遍历完链表 headA ,再开始遍历链表 headB ,当走到 node 时,共走步数为:a+(b−c)指针 B 先遍历完链表 headB ,再开始遍历链表 headA ,当走到 node 时,共走步数为:b+(a−c)如下式所示,此时指针 A , B 重合,并有两种情况:a+(b−c)=b+(a−c)若两链表 有 公共尾
2021-10-28 18:37:58
77
原创 Hive和数据库比较
Hive 和数据库除了拥有类似的查询语言,再无类似之处。1)数据存储位置Hive 存储在 HDFS 。数据库将数据保存在块设备或者本地文件系统中。2)数据更新Hive 中不建议对数据的改写。而数据库中的数据通常是需要经常进行修改的,3)执行延迟Hive 执行延迟较高。数据库的执行延迟较低。当然,这个是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。4)数据规模Hive 支持很大规模的数据计算;数据库可以支持的数据规模较小。...
2021-10-27 16:29:47
158
原创 合并两个排序的链表
题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。算法流程:1.初始化: 伪头节点 dum ,节点 cur 指向 dum 。2.循环合并: 当 l1 或 l2为空时跳出;1.当 l1.val<l2.val 时: cur的后继节点指定为 l1,并 l1 向前走一步;2.当 l1.val≥l2.val时: cur的后继节点指定为 l2 ,并 l2向前走一步 ;3.节点 cu向前走一步,即 cur=cur.next。3.合并剩余尾部: 跳出时有两种情况,即
2021-10-25 16:09:05
61
原创 链表的反转
题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。算法流程:迭代(双指针)考虑遍历链表,并在访问各节点时修改 next 引用指向,算法流程见注释。代码:class Solution { public ListNode reverseList(ListNode head) { ListNode cur = head, pre = null; while(cur != null) { ListNode t
2021-10-22 18:36:47
55
原创 Zookeeper是如何解决脑裂问题的
什么是脑裂脑裂(split-brain)就是“大脑分裂”,也就是本来一个“大脑”被拆分了两个或多个“大脑”,在zookeeper中的脑裂就是在一个zookeeper集群中出现两个或多个Leader。解决方法:过半机制zookeeper的过半机制:在领导者选举的过程中,如果某台zkServer获得了超过半数的选票,则此zkServer就可以成为Leader了。举个简单的例子:如果现在集群中有5台zkServer,那么half=5/2=2,那么也就是说,领导者选举的过程中至少要有三台zkServer投了同
2021-10-20 17:44:24
935
原创 删除链表节点
题目描述删除链表节点算法流程:1.特例处理: 当应删除头节点 head 时,直接返回 head.next 即可。2.初始化: pre = head , cur = head.next 。3.定位节点: 当 cur 为空 或 cur 节点值等于 val 时跳出。保存当前节点索引,即 pre = cur 。遍历下一节点,即 cur = cur.next 。4.删除节点: 若 cur 指向某节点,则执行 pre.next = cur.next ;若 cur 指向 null,代表链表中不包含值为 v
2021-10-18 18:54:58
61
原创 从尾到头打印链表
题目描述输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。算法流程:辅助栈法:入栈: 遍历链表,将各节点值 push 入栈。(Python 使用 append() 方法,Java借助 LinkedList 的addLast()方法)。出栈: 将各节点值 pop 出栈,存储于数组并返回。(Python 直接返回 stack 的倒序列表,Java 新建一个数组,通过 popLast() 方法将各元素存入数组,实现倒序输出)。代码:class Solution {
2021-10-16 08:58:55
54
原创 Hadoop的优化方法
一、HDFS 小文件影响(1)影响 NameNode 的寿命,因为文件元数据存储在 NameNode 的内存中(2)影响计算引擎的任务数量,比如每个小的文件都会生成一个 Map 任务二、数据输入小文件处理(1)合并小文件:对小文件进行归档(Har)、自定义 Inputformat 将小文件存储成SequenceFile 文件。(2)采用 ConbinFileInputFormat 来作为输入,解决输入端大量小文件场景。(3)对于大量小文件 Job,可以开启 JVM 重用。三、Map 阶段(
2021-10-15 20:37:26
343
原创 翻转单词顺序
题目描述输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。算法流程:栈法:从最后一个字符开始,遇到单词则入栈,遇到空格或第一个字符都要检查一下栈中是否有单词可以弹出,若有则全部弹出并拼接,每弹出一个完整的单词就添加一个空格代码:class Solution {public: string reverseWords(string s) {
2021-10-13 20:09:18
64
原创 和为S的连续正式序列
题目描述输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。算法流程:在这道题中,我们关注的是滑动窗口中所有数的和。当滑动窗口的右边界向右移动时,也就是 j = j + 1,窗口中多了一个数字 j,窗口的和也就要加上 j。当滑动窗口的左边界向右移动时,也就是 i = i + 1,窗口中少了一个数字 i,窗口的和也就要减去 i。滑动窗口只有 右边界向右移动(扩大窗口) 和 左边界向右移动(缩小窗口)
2021-10-12 17:39:25
50
原创 和为S的两个数字
题目描述在有序数组中找出两个数,使得和为给定的数 S。如果有多对数字的和等于 S,输出两个数的乘积最小的。算法流程:初始化: 双指针 i , j 分别指向数组 nums 的左右两端 (俗称对撞双指针)。循环搜索: 当双指针相遇时跳出;计算和 s=nums[i]+nums[j];若 s>targets ,则指针 j 向左移动,即执行 j=j−1 ;若 s<targets ,则指针 i 向右移动,即执行 i=i+1 ;若 s=targets ,立即返回数组 [nums[i], num
2021-10-11 21:07:25
74
原创 栈的压入弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。算法流程:考虑借用一个辅助栈 stack ,模拟 压入 / 弹出操作的排列。根据是否模拟成功,即可得到结果。入栈操作: 按照压栈序列的顺序执行。出栈操作: 每次入栈后,循环判断 “栈顶元素 = 弹出序列的当前元素”
2021-10-10 15:03:04
71
原创 count(1)、count(*)和count(指定字段)之间的区别
一、count(1)和count(*)当表的数据量比较大,对表作分析之后,使用count(1)比使用count(*)用时多。从执行计划看,count(1)和count(*)的效果是一样的。 但是在表做过分析之后,count(1)会比count()的用时少些。如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。因为count(*),自动会优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化,所以count(1)和count()基本没有
2021-10-07 16:04:11
2207
原创 用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。算法流程:维护两个栈,第一个栈支持插入操作,第二个栈支持删除操作。根据栈先进后出的特性,我们每次往第一个栈里插入元素后,第一个栈的底部元素是最后插入的元素,第一个栈的顶部元素是下一个待删除的元素。为了维护队列先进先出的特性,我们引入第二个栈,用第二个栈维护待删除的元素,在执行删除操作的时候我们首先看下第二个栈是否为空。如果为空,我们将第一个栈里的元素一个个弹出插入到第二个栈里,这样第二个栈里元素的顺序就是待删除的元素的顺序,要执
2021-10-06 14:45:10
67
原创 第一个只出现一次的字符位置
题目描述在一个字符串中找到第一个只出现一次的字符,并返回它的位置。字符串只包含 ASCII 码字符。算法流程:1.初始化: 字典 (Python)、HashMap(Java)、map(C++),记为 dic ;2.字符统计: 遍历字符串 s 中的每个字符 c ;若 dic 中 不包含 键(key) c :则向 dic 中添加键值对 (c, True) ,代表字符 c 的数量为 1 ;若 dic 中 包含 键(key) c :则修改键 c 的键值对为 (c, False) ,代表字符 c 的数量
2021-10-04 16:22:21
89
原创 数据倾斜及一些解决方法
一、数据倾斜原理做大数据开发,很有可能会遇到数据倾斜的问题,要想解决数据倾斜,首先要理解什么是数据倾斜,以及产生数据倾斜的原因。数据倾斜主要是指:主要就是数据在每个节点上的分配不均,导致个别节点处理速度很慢,使得程序迟迟不能运行结束。主要表现为:在mapreduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key中的的条数比其他key要多很多,这条key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致
2021-10-01 13:13:04
4856
原创 Spark两种持久化及其区别
一、RDD Cache 缓存RDD 通过 Cache 或者 Persist 方法将前面的计算结果缓存,默认情况下会把数据以缓存在 JVM 的堆内存中。但是并不是这两个方法被调用时立即缓存,而是触发后面的 action 算子时,该 RDD 将会被缓存在计算节点的内存中,并供后面重用。示例:// 数据缓存wordToOneRdd.cache()// 可以更改存储级别mapRdd.persist(StorageLevel.MEMORY_AND_DISK_2)二、RDD CheckPoint 检查点
2021-09-25 17:17:31
212
原创 Spark中RDD的依赖关系
一、RDD血缘关系RDD 只支持粗粒度转换,即在大量记录上执行的单个操作,在RDD上的每次操作会生成一个新的RDD。将创建 RDD 的一系列 Lineage(血统)记录下来,以便恢复丢失的分区。RDD 的 Lineage 会记录 RDD 的元数据信息和转换行为,当该 RDD 的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。二、RDD 依赖关系所谓的依赖关系,其实就是两个相邻 RDD 之间的关系。三、RDD 的宽依赖与窄依赖宽依赖表示同一个父(上游)RDD 的 Partiti
2021-09-20 09:03:30
707
原创 顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。算法流程:1.空值处理: 当 matrix 为空时,直接返回空列表 [] 即可。2.初始化: 矩阵 左、右、上、下 四个边界 l , r , t , b ,用于打印的结果列表 res 。3.循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环,每个方向打印中做以下三件事 (各方向的具体信息见下表) ;(1)、根据边界打印,即将元素按顺序添加至列表 res 尾部;(2)、边界向内收缩 1 (代表已被打印);(
2021-09-16 19:13:27
63
原创 二维数组中的查找
题目描述给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。算法流程:从矩阵 matrix 左下角元素(索引设为 (i, j) )开始遍历,并与目标值对比:当 matrix[i][j] > target 时,执行 i-- ,即消去第 i 行元素;当 matrix[i][j] < target 时,执行 j++ ,即消去第 j 列元素;当 matrix[i][j] = target 时,返回 truetruetrue ,代表找到目
2021-09-14 16:09:44
141
原创 算法题-数组中重复数字
题目描述在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。解题思路:方法一:哈希表 / Set利用数据结构特点,容易想到使用哈希表(Set)记录数组的各个数字,当查找到重复数字则直接返回。算法流程:初始化: 新建 HashSet ,记为 dicdicdic ;遍历数组 numsnumsnums 中的每个数字 numnumnum :当 numnumnum 在 dic
2021-09-12 09:26:17
93
原创 Spark算子groupByKey和reduceByKey区别
从 shuffle 的角度:reduceByKey 和 groupByKey 都存在shuffle的操作,但reduceByKey可以在 shuffle 前对分区内相同 key 的数据进行预聚合(combine)功能,这样会减少落盘的数据量,而groupByKey只是进行分组,不存在数据量减少的问题,reduceByKey性能比较高。从功能的角度:reduceByKey 包含分组和聚合的功能。而GroupByKey 只能分组,不能聚合,所以在分组聚合的场合下,推荐使用reduceByKey,如果仅仅是
2021-09-11 13:18:47
196
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人