
try {
ClassforName("orgapachehadoophivejdbcHiveDriver");
String selectSql = "select from dbdata where address = '11111111'";
Connection connect = DriverManagergetConnection("jdbc:hive://192168xxxx:10000/db", "xxx", "xxx");
PreparedStatement state = null;
state = connectprepareStatement(selectSql);
ResultSet resultSet = stateexecuteQuery();
while (resultSet != null && resultSetnext()) {
Systemoutprintln(resultSetgetString(1) + " " + resultSetgetString(2));
}
} catch (Exception e) {
eprintStackTrace();
}
步骤
Hive提供了jdbc驱动,使得我们可以连接Hive并进行一些类关系型数据库的sql语句查询等 *** 作,首先我们需要将这些驱动拷贝到报表工程下面,然后再建立连接,最后通过连接进行数据查询。
拷贝jar包到FR工程
将hadoop里的hadoop-commonjar拷贝至报表工程appname/WEB-INF/lib下;
将hive里的hive-execjar、hive-jdbcjar、hive-metastorejar、hive-servicejar、libfb303jar、log4jjar、slf4j-apijar、slf4j-log4j12jar拷贝至报表工程appname/WEB-INF/lib下。
配置数据连接
启动设计器,打开服务器>定义数据连接,新建JDBC连接。
每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数,结果数据格式如下:
答案:
答案:
答案:
编写sql实现,结果如下:
答案:
答案:
答案:
答案:
注意 :这道题没有数据我随便写的,只写了思路
答案:
答案:
答案:
数据如下:
编写sql实现,得到结果如下:
答案:
答案:
答案:
答案:
答案:
答案:
答案:
答案:
答案:
答案:
答案:
答案:
答案:
答案:
答案:
答案:
在开发过程中使用spark去读取hive分区表的过程中(或者使用hive on spark、nodepad开发工具),部分开发人员未注意添加分区属性过滤导致在执行过程中加载了全量数据,引起任务执行效率低、磁盘IO大量损耗等问题
1、自定义规则CheckPartitionTable类,实现Rule
然后通过此种方法创建SparkSession
2、自定义规则CheckPartitionTable类,实现Rule,将规则类追加致Optimizerbatches: Seq[Batch]中
1、CheckPartitionTable规则执行类,需要通过引入sparkSession从而获取到引入conf;需要继承Rule[LogicalPlan];
2、通过splitPredicates方法,分离分区谓词,得到分区谓词表达式
在sql解析过程中将谓词解析为TreeNode,此处采用递归的方式获取分区谓词
3、判断是否是分区表,且是否添加分区字段
4、实现Rule的apply方法
关于spark-sql的主要执行流程及预备知识,可参照我同学的这篇博文 >
目标:
1、掌握hive基础语法、常用函数及其组合使用
2、掌握一些基本业务指标的分析思路与实现技巧
1)某次经营活动中,商家发起了“异性拼团购”,试着针对某个地区的用户进行推广,找出匹配用户。
注意:如果该表是一个分区表,则where条件中必须对分区字段进行限制
2)选出在2018年12月31日,购买的商品品类是food的用户名、购买数量、支付金额
3)试着对本公司2019年第一季度商品的热度与价值度进行分析。
"2019年一月到三月,每个品类有多少人购买,累计金额是多少"
GROUP BY HAVING(分类汇总过滤)
4)找出在2019年4月支付金额超过5万元的用户,给这些VIP用户赠送优惠券
5)2019年4月,支付金额最多的TOP5用户
查看Hive中的函数:show functions;
查看具体函数的用法:1)desc function 函数名;2)desc function extended函数名;
6)
7)用户的首次激活时间,与2019年5月1日的日期间隔。
datediff(string enddate,string startdate):结束日期减去开始日期的天数
拓展:日期增加函数(增加天数)、减少函数(减少天数) —— date_add、date_sub(类型要是string类型的)
date_add(string startdate,int days)、date_sub(string startdate,int days)
case when 函数
8)统计以下四个年龄段20岁以下、20-30岁、30-40岁、40岁以上的用户数
case when 的时候不用加group by,只有在聚合函数的时候才需要group by
if 函数
9)统计每个性别的用户等级高低分布情况(假设level大于5为高级,注意列名不能使用中文的)
10)分析每个月都拉新情况
substring(stringA,INT start,int len),substr(stringA,INT start,int len),截取起始位置和截取长度
extra1需要解析json字段,然后用$key取出想要获取的value;
extra2使用的是中括号加引号的方式进行字段提取和分组;
两种写法要看字段类型的不同采取不同的方式
11)求不同手机品牌的用户数
12)ELLA用户的2018年的平均每次支付金额,以及2018年最大的支付日期和最小的支付日期的间隔
13)2018年购买的商品品类在两个以上的用户数
步骤总结:
1、先求出每个人购买的商品品类书
2、筛选出购买商品品类书大于2的用户
3、统计符合条件的用户有多少个
14)用户激活时间在2018年,年龄段在20-30岁和30-40岁的婚姻情况分布
步骤总结:
1、先选出激活时间在2018年的用户,并把他们所在的年龄段计算好,并提取出婚姻状况;
如何select后面没有进行聚合,则可以不用使用group by,直接使用where进行过滤就可以;
2、取出年龄段在20-30岁和30-40岁的用户,把他们的婚姻状况转义成可理解的说明;
3、聚合计算,针对年龄段,婚姻状况的聚合
map的数量
map的数量通常是由hadoop集群的DFS块大小确定的,也就是输入文件的总块数,正常的map数量的并行规模大致是每一个Node是10~100个,对于CPU消耗较小的作业可以设置Map数量为300个左右,但是由于hadoop的每一个任务在初始化时需要一定的时间,因此比较合理的情况是每个map执行的时间至少超过1分钟。具体的数据分片是这样的,InputFormat在默认情况下会根据hadoop集群的DFS块大小进行分片,每一个分片会由一个map任务来进行处理,当然用户还是可以通过参数mapredminsplitsize参数在作业提交客户端进行自定义设置。还有一个重要参数就是mapredmaptasks,这个参数设置的map数量仅仅是一个提示,只有当InputFormat
决定了map任务的个数比mapredmaptasks值小时才起作用。同样,Map任务的个数也能通过使用JobConf
的confsetNumMapTasks(int
num)方法来手动地设置。这个方法能够用来增加map任务的个数,但是不能设定任务的个数小于Hadoop系统通过分割输入数据得到的值。当然为了提高集群的并发效率,可以设置一个默认的map数量,当用户的map数量较小或者比本身自动分割的值还小时可以使用一个相对交大的默认值,从而提高整体hadoop集群的效率。
2 reduece的数量
reduce在运行时往往需要从相关map端复制数据到reduce节点来处理,因此相比于map任务。reduce节点资源是相对比较缺少的,同时相对运行较慢,正确的reduce任务的个数应该是095或者175
(节点数
×mapredtasktrackertasksmaximum参数值)。如果任务数是节点个数的095倍,那么所有的reduce任务能够在
map任务的输出传输结束后同时开始运行。如果任务数是节点个数的175倍,那么高速的节点会在完成他们第一批reduce任务计算之后开始计算第二批
reduce任务,这样的情况更有利于负载均衡。同时需要注意增加reduce的数量虽然会增加系统的资源开销,但是可以改善负载匀衡,降低任务失败带来的负面影响。同样,Reduce任务也能够与
map任务一样,通过设定JobConf 的confsetNumReduceTasks(int num)方法来增加任务个数。
3 reduce数量为0
有些作业不需要进行归约进行处理,那么就可以设置reduce的数量为0来进行处理,这种情况下用户的作业运行速度相对较高,map的输出会直接写入到 SetOutputPath(path)设置的输出目录,而不是作为中间结果写到本地。同时Hadoop框架在写入文件系统前并不对之进行排序。
select aid,ainfo,bnum from a join b on aid=bid and where bnum>=10
两个表做关联,首先where会过滤掉不需要的数据。
至于表怎么做map和reduce *** 作,在hive里的表是虚拟的,其实还是对hdfs文件进行 *** 作,你可以在hdfs:///user/hive/warehouse路径下找到以表名来命名的文件,里面就是表的内容,可以执行-cat命令查看。所以,它的map *** 作很简单,就是按行读文件,然后会根据hive的默认分隔符\001对每行进行切分。切分完成后就会按照你SQL指定的逻辑进行合并,最后再输出成hdfs文件,只不过在hive里面看它是以表的形式展现的。
job数会在你执行sql语句之后紧接着有相应的日志记录,
Total MapReduce jobs = 2
Launching Job 1 out of 2
Number of reduce tasks not specified Estimated from input data size: 2
In order to change the average load for a reducer (in bytes):
set hiveexecreducersbytesperreducer=<number>
In order to limit the maximum number of reducers:
set hiveexecreducersmax=<number>
In order to set a constant number of reducers:
这样就是有两个job,正在执行第一个job。
Hadoop job information for Stage-1: number of mappers: 5; number of reducers: 2
而这个就会告诉你有多少个mapper和reducer。
像你写的这个sql有join *** 作,而且是hiveSQL里面最普通的join,那么一定会有reducer参与,如果数据量很大,比如上千万条记录,join就会特别慢,job进度就会一直卡在reduce *** 作。可以改成mapjoin或者sort merge bucket mapjoin。
其实hive效率不高,不适合实时查询,即使一个表为空,用hive进行查询也会很耗时,因为它要把sql语句翻译成MR任务。虽然简化了分布式编程,但是效率上就会付出代价。
你的这句sql应该会翻译成一个JOB来执行,就是简单地map和reduce。
mapreduce就是按行读文件,然后切分,合并,输出成文件。
以上就是关于java中怎么实现查询出hive下所有数据库下表名全部的内容,包括:java中怎么实现查询出hive下所有数据库下表名、怎么获取hive组件服务可用状态、hive sql面试题及答案等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)