Hive函数重要应用案例
多字节分隔符应用场景Hive中的分隔符Hive中默认使用单字节分隔符来加载文本数据,例如逗号、制表符、空格等等,默认的分隔符为\001。根据不同文件的不同分隔符,我们可以通过在创建表时使用 row format delimited fields terminated by ‘单字节分隔符’ 来指定文件中的分割符,确保正确将表中的每一列与文件中的每一列实现一一对应的关系。
特殊数据在实际工作中,我们遇到的数据往往不是非常规范化的数据,例如我们会遇到以下的两种情况
情况一:每一行数据的分隔符是多字节分隔符,例如:”||”、“—”等
上图中每列的分隔符为||,为多字节分隔符
情况二:数据的字段中包含了分隔符
上图中每列的分隔符为空格,但是数据中包含了分割符,时间字段中也有空格
192.168.88.134 [08/Nov/2020:10:44:32 +0800] "GET / HTTP/1.1" 404 951
问题与需求问题基于上述的两种特殊数据,我们如果使用正常的加载数据的方式将数据加载到表中,就会出以下两种错误:
情况一:加载数据的分隔符为多字节分 ...
Hive参数配置与函数、运算符使用
Hive参数配置CLIs and Commands客户端和命令Hive CLI$HIVE_HOME/bin/hive是一个shellUtil,通常称之为hive的第一代客户端或者旧客户端,主要功能有两个:
一:用于以交互式或批处理模式运行Hive查询,注意,此时作为客户端,需要并且能够访问的是Hive metastore服务,而不是hiveserver2服务。
二:用于hive相关服务的启动,比如metastore服务。
可以通过运行”hive -H” 或者 “hive —help”来查看命令行选项。
-e <quoted-query-string> 执行命令行-e参数后指定的sql语句 运行完退出。
-f <filename> 执行命令行-f参数后指定的sql文件 运行完退出。
-H,--help 打印帮助信息
--hiveconf <property=value> 设置参数
-S,--silent 静默模 ...
Hive SQL 数据操控、查询语言(DML、DQL)
DML-Load加载数据背景回想一下,当在Hive中创建好表之后,默认就会在HDFS上创建一个与之对应的文件夹,默认路径是由参数hive.metastore.warehouse.dir控制,默认值是/user/hive/warehouse。
要想让hive的表和结构化的数据文件产生映射,就需要把文件移到到表对应的文件夹下面,当然,可以在建表的时候使用location语句指定数据文件的路径。但是不管路径在哪里,必须把数据文件移动到对应的路径下面。
最原始暴力直接的方式就是使用hadoop fs –put等方式将数据移动到路径下面。
Hive官方推荐使用Load命令将数据加载到表中。
Load语法在将数据load加载到表中时,Hive不会进行任何转换。
加载操作是将数据文件移动到与Hive表对应的位置的纯复制/移动操作。
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
LOAD DATA [LOCAL] ...
Hive SQL数据定义语言DDL
数据定义语言(DDL)概述DDL语法的作用数据定义语言 (Data Definition Language, DDL),是SQL语言集中对数据库内部的对象结构进行创建,删除,修改等的操作语言,这些数据库对象包括database(schema)、table、view、index等。核心语法由CREATE、ALTER与DROP三个所组成。DDL并不涉及表内部数据的操作。
在某些上下文中,该术语也称为数据描述语言,因为它描述了数据库表中的字段和记录。
Hive中DDL使用Hive SQL(HQL)与SQL的语法大同小异,基本上是相通的,学过SQL的使用者可以无痛使用Hive SQL。只不过在学习HQL语法的时候,特别要注意Hive自己特有的语法知识点,比如partition相关的DDL操作。
基于Hive的设计、使用特点,HQL中create语法(尤其create table)将是学习掌握DDL语法的重中之重。可以说建表是否成功直接影响数据文件是否映射成功,进而影响后续是否可以基于SQL分析数据。通俗点说,没有表,表没有数据,你分析什么呢?
选择正确的方向,往往比盲目努力重要。
Hive ...
Hive性能优化和Hive3新特性
Hive表设计优化分区表Hive查询基本原理Hive的设计思想是通过元数据将HDFS上的文件映射成表,基本的查询原理是当用户通过HQL语句对Hive中的表进行复杂数据处理和计算时,默认将其转换为分布式计算MapReduce程序对HDFS中的数据进行读取处理的过程。
例如,当我们在Hive中创建一张表tb_login并关联HDFS上的文件,用于存储所有用户的登录信息,当我们对这张表查询数据时,Hive中的实现过程如下:
step1:创建表
--创建数据库
create database tb_part;
--创建表
create table tb_login(
userid string,
logindate string
) row format delimited fields terminated by '\t';
HDFS中自动在Hive数据仓库的目录下和对应的数据库目录下,创建表的目录
step2:关联数据
load data local inpath '/export/data/login.log' into table tb_login;
...
数据仓库基础与Apache Hive入门
数据仓库数据仓库概念数据仓库(英语:Data Warehouse,简称数仓、DW),是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。
数据仓库本身并不“生产”任何数据,其数据来源于不同外部系统;同时数据仓库自身也不需要“消费”任何的数据,其结果开放给各个外部应用使用,这也是为什么叫“仓库”,而不叫“工厂”的原因。
场景案例:数据仓库为何而来?先下结论:为了分析数据而来,分析结果给企业决策提供支撑。
信息总是用作两个目的:操作型记录的保存和分析型决策的制定。数据仓库是信息技术长期发展的产物。
下面以中国人寿保险公司(chinalife)发展为例,阐述数据仓库为何而来?
操作型记录的保存中国人寿保险(集团)公司下辖多条业务线,包括:人寿险、财险、车险,养老险等。各业务线的业务正常运营需要记录维护包括客户、保单、收付费、核保、理赔等信息。
联机事务处理系统(OLTP)正好可以满足上述业务需求开展, 其主要任务是执行联机事务和查询处理。其基本特征是前台接收的用户数据可以立即传送到后台进行处理,并在很短 ...
java并发工具类CyclicBarrier
CyclicBarrier简介CyclicBarrier,是JDK1.5的java.util.concurrent并发包中提供的一个并发工具类。
所谓Cyclic即 循环 的意思,所谓Barrier即 屏障 的意思。
所以综合起来,CyclicBarrier指的就是 循环屏障,虽然这个叫法很奇怪,但是确能很好地表示它的作用。
它的作用就是会让所有线程都等待完成后才会继续下一步行动。
举个例子,就像生活中我们会约朋友们到某个餐厅一起吃饭,有些朋友可能会早到,有些朋友可能会晚到,但是这个餐厅规定必须等到所有人到齐之后才会让我们进去。这里的朋友们就是各个线程,餐厅就是 CyclicBarrier。
CyclicBarrier栅栏 CyclicBarrier和CountDownLatch是非常类似的,CyclicBarrier核心的概念是在于设置一个等待线程的数量边界,到达了此边界之后进行执行。
CyclicBarrier类是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点(Common Barrier Point)。
CyclicBarrier类是一种同步机制,它能够对处理 ...
java并发工具类CountDownLatch
CountDownLatch的简介CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、 ConcurrentHashMap和BlockingQueue,它们都存在于JUC (java.util.concurrent)包下
CountDownLatch原理 CountDownLatch是通过一个计数器来实现的,计数器的初始化值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就相应得减1(CountDownLatch.countDown()方法)。当计数器到达0时,表示所有的线程都已完成任务,,然后在闭锁上等待CountDownLatch.await()方法的线程就可以恢复执行任务。
注意:这是一个一次性操作 - 计数无法重置。 如果你需要一个重置的版本计数,考虑使用CyclicBarrier。
应用场景 实现最大的并行性:有时我们想同时启动多个线程,实现最大程度的并行性。例如,我们想测试一个单例类 ...
微服务搭建
Eureka注册中心背景 服务发现是基于微服务的体系结构的关键原则之一。尝试手工配置每个客户端或某种形式的约定可能很困难,而且很脆弱。Eureka是Netflix的服务发现服务器和客户端。可以将服务器配置和部署为高可用性,每个服务器将注册服务的状态复制到其他服务器。
简介 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
Eureka组件Eureka Server Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round- ...
java并发工具类-Fork-Join
Fork-Join java下多线程的开发可以我们自己启用多线程,线程池,还可以使用forkjoin,forkjoin可以让我们不去了解诸如Thread,Runnable等相关的知识,只要遵循forkjoin的开发模式,就可以写出很好的多线程并发程序。
Fork-Join 是什么 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。
分而治之 “分而治之” 一直是一个有效的处理大量数据的方法。著名的 MapReduce 也是采取了分而治之的思想。简单来说,就是如果你要处理1000个数据,但是你并不具备处理1000个数据的能力,那么你可以只处理其中的10个,然后,分阶段处理100次,将100次的结果进行合成,那就是最终想要的对原始的1000个数据的处理结果。
同时forkjoin在处理某一类问题时非常的有用,哪一类问题?分而治之的问题。十大计算机经典算法:快速排序、堆排序、归并排序、二分查找、线性查找、
深度优先、广度优先、Dijkstra、动态规划、朴素贝叶斯分类,有几个属于分而治之 ...
线程间协作
多线程的协作 线程开始运行,拥有自己的栈空间,就如同一个脚本一样,按照既定的代码一步一步地执行,直到终止。但是,每个运行中的线程,如果仅仅是孤立地运行,那么没有一点儿价值,或者说价值很少,如果多个线程能够相互配合完成工作,包括数据之间的共享,协同处理事情。这将会带来巨大的价值。
线程之间相互配合,完成某项工作,比如:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程。前者是生产者,后者就是消费者,这种模式隔离了“做什么”(what)和“怎么做”(How),简单的办法是让消费者线程不断地循环检查变量是否符合预期在while循环中设置不满足的条件,如果条件满足则退出while循环,从而完成消费者的工作
多线程的协作就像人之间的协作一样,配合完成某样事情,但是线程间协作一下几个难点
难以确保及时性
难以降低开销
如果降低睡眠的时间,比如休眠1毫秒,这样消费者能更加迅速地发现条件变化,但是却可能消耗更多的处理器资源,造成了无端的浪费。
等待/通知机制 是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个 ...
JAVA动态代理源码分析
动态代理简介 Proxy模式是常用的设计模式,其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。
用户可以更加结构图,自己编码完成Proxy模式。这种实现称为静态代理。
Java提供了java.lang.reflect.Proxy类与InvocationHandler接口,配合反射,可以实现动态代理。静态代理的代理类与代理操作,都是事先编码,运行过程种无法修改代理结构。动态代理的代理与代理操作,都是在运行过程中,动态生成,可以在运行过程中,修改代理结构,符合面向对象的开闭原则。
最最最主要的原因就是,在不改变目标对象方法的情况下对方法进行增强,比如,我们希望对方法的调用增加日志记录,或者对方法的调用进行拦截,等等…
动态代理用于将在不需要修改原代码的情况下进行代码的增加,spring中的AOP,事务,都是使用动态代理来实现的,我们天天都在使用动态代理只是自己不知道而已。
动态代理三大要素
需要定义一个接口
java动态代理类只能代理接口(不支持抽象类),如果没有接口就要使用cjlib
需要一个实现类继承这 ...