![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Hive
文章平均质量分 61
大数据学习与分享
【微信公众号:大数据学习与分享】专注于大数据领域常用技术,如Spark、Hadoop、Hive、HBase、Kafka、Zookeeper等技术的使用、实战技巧、源码解读,语言主要以Java和Scala为主
展开
-
如何使用spark或者hive sql将Excel文件加载为一张hive表
一、Spark实现方案1. 创建Hive外部表, 数据保存格式为parquetcreate external table `bigdatalearnshare.test_excel_file`(`id` string,`name` string,`age` string)stored as parquetlocation '/bigdatalearnshare/test/test_excel_file';2. spark代码demospark版本: 2.4.3scala版本: 2.11原创 2022-04-16 22:18:04 · 2878 阅读 · 0 评论 -
Hive函数:row_number() over() 、 rank和dense_rank
row_number() over()为查询出来的每一行记录生成一个序号。序号从1开始,按照顺序,生成分组内记录的序列,row_number()的值不会存在重复,当排序的值相同时,按照表中记录的顺序进行排列。示例:利用row_number函数,对表中的数据根据id进行分组,按照pv倒序排序求最大的pv相关信息。select t.id, t.date, t.pvfrom(selectid,date, pv, row_number() over(partition by id ord原创 2021-06-18 16:18:40 · 1515 阅读 · 0 评论 -
Spark SQL和Hive中的函数(五):SparkSQL函数算子
本系列文章主要介绍Spark SQL/Hive中常用的函数,主要分为字符串函数、JSON函数、时间函数、开窗函数以及在编写Spark SQL代码应用时实用的函数算子五个模块。本篇文章主要介绍SparkSQL函数算子。之前介绍的函数都是可以直接在SQL中应用的。那么如果是在Spark SQL的DataFrame/DataSet的算子中调用,可以参考DataFrame/DataSet的算子以及org.apache.spark.sql.functions._下的函数:关联文章:经典的SparkSQL/原创 2021-03-30 09:14:03 · 331 阅读 · 0 评论 -
Spark SQL和Hive中的函数(四)常用的开窗函数
开窗函数格式通常满足:function_name([argument_list])OVER ([PARTITION BY partition_expression,…][ORDER BY sort_expression, … [ASC|DESC]])function_name: 函数名称,比如SUM()、AVG()partition_expression:分区列sort_expression:排序列注意:以下举例涉及的表employee中字段含义:name(员工姓名)、dept_no(部门原创 2021-03-23 11:13:16 · 566 阅读 · 0 评论 -
Spark SQL和Hive中的函数(三):时间函数
1. current_date / current_timestamp获取当前时间select current_date;select current_timestamp;2. 从日期时间中提取字段/格式化时间1)year、month、day、dayofmonth、hour、minute、second-- 20select day("2020-12-20");2)dayofweek(1 = Sunday, 2 = Monday, …, 7 = Saturday)、dayofyear--原创 2021-03-17 09:01:16 · 1025 阅读 · 0 评论 -
Spark SQL和Hive中的函数(二):JSON函数
1. get_json_object-- v2select get_json_object('{"k1": "v1", "k2": "v2"}', '$.k2');2. from_jsonselect tmp.k from (select from_json('{"k": "fruit", "v": "apple"}','k STRING, v STRING', map("","")) as tmp);这个方法可以给json定义一个Schema,这样在使用时,就可以直接使用a.k这种方式原创 2021-03-16 11:33:27 · 1980 阅读 · 0 评论 -
Spark SQL和Hive中的函数(一):字符串函数
本系列文章主要介绍Spark SQL/Hive中常用的函数,主要分为字符串函数、JSON函数、时间函数、开窗函数以及在编写Spark SQL代码应用时实用的函数算子五个模块。1. concat对字符串进行拼接:concat(str1, str2, …, strN) ,参数:str1、str2…是要进行拼接的字符串。-- return the concatenation of str1、str2、..., strN-- SparkSQLselect concat('Spark', 'SQL');原创 2021-03-12 09:30:21 · 1176 阅读 · 0 评论 -
Hive常用性能优化方法实践全面总结
Apache Hive作为处理大数据量的大数据领域数据建设核心工具,数据量往往不是影响Hive执行效率的核心因素,数据倾斜、job数分配的不合理、磁盘或网络I/O过高、MapReduce配置的不合理等等才是影响Hive性能的关键。Hive在执行任务时,通常会将Hive SQL转化为MapReduce job进行处理。因此对Hive的调优,除了对Hive语句本身的优化,也要考虑Hive配置项以及MapReduce相关的优化。从更底层思考如何优化性能,而不是仅仅局限于代码/SQL的层面。列裁剪和分区裁剪H原创 2021-02-03 15:39:35 · 1045 阅读 · 0 评论 -
一张图了解Hive与传统的关系型数据库(RDBMS)的区别
关联文章:必须掌握的分布式文件存储系统—HDFS关于HDFS应知应会的几个问题详解MapReduce原创 2021-01-19 09:28:05 · 429 阅读 · 0 评论 -
Hive中的3种虚拟列以及Hive如何进行条件判断
9. Hive中的3种虚拟列当Hive产生非预期的数据或null时,可以通过虚拟列进行诊断,判断哪行数据出现问题,主要分3种:1. INPUT__FILE__NAME每个map任务输入文件名2. BLOCK__OFFSET__INSIDE__FILEmap任务处理的数据所对应文件的块内偏移量,当前全局文件的偏移量。对于块压缩文件,就是当前块的文件偏移量,即当前块的第一个字节在文件中的偏移量3. ROW__OFFSET__INSIDE__BLOCK行偏移量,默认不可用。需要设置hive.exec原创 2021-01-11 17:39:24 · 803 阅读 · 1 评论 -
Hive join转化为MapReduce任务
8. Hive JOIN写join查询时,需要注意几个关键点:1)只支持等值join,因为非等值连接非常难转化为MapReduce任务示例:select a.* from a join b on a.id = b.id是正确的,然而:select a.* from a join b on a.id>b.id是错误的。2)可以join多个表,如果join中多个表的join的列是同一个,则join会被转化为单个MapReduce任务示例:select a., b., c.* from a joi原创 2020-12-24 20:44:47 · 593 阅读 · 0 评论 -
Hive中的分区、分桶以及数据抽样
6. Hive中的分区、分桶以及数据抽样对Hive表进行分区、分桶,可以提高查询效率,抽样效率6.1 分区分区,在hdfs中表现为table目录下的子目录6.2 分桶对应建表时bucket关键字,在hdfs中表现为同一个表目录下根据hash散列之后的多个文件,会根据不同的文件把数据放到不同的桶中。如果分桶表导入数据没有生成对应数量的文件,可通过如下方式解决:开启自动分桶,设置参数:set hive.enforce.bucketing= true手动设置reduce数量,比如set m原创 2020-12-21 09:25:49 · 696 阅读 · 0 评论 -
Hive的严格模式和非严格模式
7. Hive的严格模式和非严格模式通过设置参数hive.mapred.mode来设置是否开启严格模式。目前参数值有两个:strict(严格模式)和nostrict(非严格模式,默认)。通过开启严格模式,主要是为了禁止某些查询(这些查询可能造成意想不到的坏的结果),目前主要禁止3种类型的查询:1)分区表查询在查询一个分区表时,必须在where语句后指定分区字段,否则不允许执行。因为在查询分区表时,如果不指定分区查询,会进行全表扫描。而分区表通常有非常大的数据量,全表扫描非常消耗资源。2)orde原创 2020-12-18 10:39:44 · 3777 阅读 · 0 评论 -
Hive中order by、sort by、distribute by、cluster by的区别
order by: 会将所有的数据汇聚到一个reduce上去执行,然后能保证全局有序。但是效率低,因为不能并行执行sort by: 当设置mapred.reduce.tasks>1,则sort by只保证每个reducer的输出有序,不保证全局有序。好处是:执行了局部排序之后可以为接下去的全局排序提高不少的效率(其实就是做一次归并排序就可以做到全局排序。distribute by: 根据指定的字段将数据分到不同的reduce,且分发算法是hash散列。能保证每一个reduce负责的数据范围不重叠了原创 2020-12-14 09:04:19 · 633 阅读 · 0 评论 -
Hive的数据类型、内部表和外部表
3. Hive的数据类型Hive内置数据类型主要分为两类:基础数据类型和复杂数据类型。基础数据类型无外乎就是tinyint、smallint、int、bigint、boolean、float、double、string、timestamp、decimal等。笔者这里主要介绍Hive的复杂数据类型,或者称之为集合类型。Hive的复杂数据类型主要分三种:map、array、struct,并且支持复杂类型嵌套,利用好这些数据类型,将有效提高数据查询效率。目前为止对于关系型数据库不支持这些复杂类型。首先原创 2020-12-11 10:39:46 · 465 阅读 · 0 评论 -
Hive的架构设计和建表语义
Apache Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供一种HQL语言进行查询,具有扩展性好、延展性好、高容错等特点,多应用于离线数仓建设。1. Hive架构存储: Hive底层存储依赖于hdfs,因此也支持hdfs所支持的数据存储格式,如text、json、parquet等。当我们将一个文件映射为Hive中一张表时,只需在建表的时告诉Hive,数据中的列名、列分隔符、行分隔符等,Hive就可以自动解析数据。支持多种压缩格式: bzip2、gzip原创 2020-12-10 09:48:17 · 186 阅读 · 1 评论 -
Hive数据导入HBase引起数据膨胀引发的思考
最近朋友公司在做一些数据的迁移,主要是将一些Hive处理之后的热数据导入到HBase中,但是遇到了一个很奇怪的问题:同样的数据到了HBase中,所占空间竟增长了好几倍!详谈中,笔者建议朋友至少从几点原因入手分析:HBase中的数据相对于Hive中的数据会新增一些附加信息导致磁盘占用的增加,比如布隆过滤器Hive中的数据是否进行过压缩,比如snappy,压缩比还是很高的row key和列族都会占据一定的空间,当数据量较大时,仅二者就会占据很多不必要的空间建议将相同查询场景下的几个常用的原创 2020-12-01 09:04:25 · 521 阅读 · 0 评论 -
Hive建表时开启事务机制导致insert失败: This command is not allowed on an ACID table.. with a non-ACID transaction
建表语句:create table A ( table_code string, data_dt string, update_dt string) clustered by (table_code) into 1 buckets row format delimited fields terminated by '\033' stored as orc -- orc格式 tablproperties('transactional'='原创 2020-11-19 09:14:32 · 3809 阅读 · 1 评论 -
Spark SQL处理decimal类型空指针异常(spark.sql.hive.convertMetastoreParquet)
系列三在此之前可以先阅读文章:SparkSQL与Hive metastore Parquet转换但如果同时设置spark.sql.hive.convertMetastoreParquet为false时,要注意一些数据类型以及精度的处理,比如对于decimal类型的处理。通过一个例子复原一下当时的场景:1.创建Hive外部表testdb.test_decimal,其中字段fee_rate为decimal(10,10)CREATE EXTERNAL TABLE `testdb`.`test_decima原创 2020-11-06 09:22:18 · 2033 阅读 · 0 评论 -
SparkSQL与Hive metastore Parquet
Spark SQL为了更好的性能,在读写Hive metastore parquet格式的表时,会默认使用自己的Parquet SerDe,而不是采用Hive的SerDe进行序列化和反序列化。该行为可以通过配置参数spark.sql.hive.convertMetastoreParquet进行控制,默认true。这里从表schema的处理角度而言,就必须注意Hive和Parquet兼容性,主要有两个区别:Hive是大小写敏感的,但Parquet相反Hive会将所有列视为nullable,但是原创 2020-11-03 18:16:50 · 1373 阅读 · 0 评论 -
SparkSQL存储数据到Parquet:AnalysisException: Parquet data source does not support null data type.
使用SparkSQL(2.4版本)往存储格式为parquet的Hive分区表中存储NullType类型的数据时报错:org.apache.spark.sql.AnalysisException: Parquet data source does not support null data type.虽然在Stack OverFlow上找到了类似的问题,但没有具体阐明到底是什么原因导致了这种问题以及如何解决?1.场景模拟1)创建temp view:test_viewsparkSession.sql原创 2020-10-30 20:06:14 · 3825 阅读 · 1 评论 -
经典的SparkSQL/Hive-SQL/MySQL面试-练习题(一)
第一题需求:已知一个表order,有如下字段:date_time,order_id,user_id,amount。数据样例:2020-10-10,1003003981,00000001,1000,请用sql进行统计:(1)2019年每个月的订单数、用户数、总成交金额。(2)2020年10月的新客数(指在2020年10月才有第一笔订单)实现:(1)SELECT t1.year_month,count(t1.order_id) AS order_cnt,count(DISTINCT t1.原创 2020-09-30 14:39:05 · 650 阅读 · 0 评论 -
Hive如何实现自增序列
在利用数据仓库进行数据处理时,通常有这样一个业务场景,为一个Hive表新增一列自增字段(比如事实表和维度表之间的"代理主键")。虽然Hive不像RDBMS如mysql一样本身提供自增主键的功能,但它本身可以通过函数来实现自增序列功能:利用row_number()窗口函数或者使用UDFRowSequence。示例:table_src是我们经过业务需求处理的到的中间表数据,现在我们需要为table_src新增一列自增序列字段auto_increment_id,并将最终数据保存到table_dest中。1.原创 2020-07-17 12:25:10 · 3804 阅读 · 0 评论 -
Hive数据导入HBase引起数据膨胀引发的思考
最近朋友公司在做一些数据的迁移,主要是将一些Hive处理之后的热数据导入到HBase中,但是遇到了一个很奇怪的问题:同样的数据到了HBase中,所占空间竟增长了好几倍!详谈中,笔者建议朋友至少从几点原因入手分析:HBase中的数据相对于Hive中的数据会新增一些附加信息导致磁盘占用的增加,比如布隆过滤器Hive中的数据是否进行过压缩,比如snappy,压缩比还是很高的row key和列族都会占据一定的空间,当数据量较大时,仅二者就会占据很多不必要的空间建议将相同查询场景下的几个常用的原创 2020-07-09 20:10:35 · 595 阅读 · 0 评论 -
Spark存储Parquet数据到Hive,对map、array、struct字段类型的处理
利用Spark往Hive中存储parquet数据,针对一些复杂数据类型如map、array、struct的处理遇到的问题?为了更好的说明导致问题的原因、现象以及解决方案,首先看下述示例:创建存储格式为parquet的Hive非分区表:CREATE EXTERNAL TABLE `t1`(`id` STRING,`map_col` MAP<STRING, STRING>,`arr_col` ARRAY<STRING>,`struct_col` STRUCT<A:ST原创 2020-06-23 22:17:32 · 1276 阅读 · 0 评论 -
Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件
首先说一下,这里解决的问题应用场景:sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区?这里涉及到两种情况:select SQL查询和加载Hive表路径的方式。这里仅就"加载Hive表路径的方式"解析分区表字段,在处理时出现的一些问题及解决作出详细说明。如果大家有类似的需求,笔者建议通过解析Spark SQL logical plan和下面说的这种方式解决方案结合,封装成一个通用的工具。问题现象sparksql加载指定Hive分原创 2020-06-06 20:39:44 · 1219 阅读 · 0 评论 -
Hive面试常问与工作实用 —— Hive Join优化
在阐述Hive Join具体的优化方法之前,首先看一下Hive Join的几个重要特点,在实际使用时也可以利用下列特点做相应优化:1.只支持等值连接2.底层会将写的HQL语句转换为MapReduce,并且reduce会将join语句中除最后一个表外都缓存起来3.当三个或多个以上的表进行join操作时,如果每个on使用相同的字段连接时只会产生一个mapreduce具体的优化建议:1.合理的设置map和reduce数量jvm重用。可在hadoop的mapred-site.xml中设置jvm被重用的次原创 2020-05-11 21:23:05 · 294 阅读 · 0 评论 -
Hive建表时开启事务机制导致insert失败
建表语句:create table A ( table_code string, data_dt string, update_dt string) clustered by (table_code) into 1 buckets row format delimited fields terminated by '\033' stor...原创 2020-05-04 15:46:56 · 1215 阅读 · 0 评论