hive是基于Hadoop的一个数据仓库工具,用来进行数据的ETL,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能。Hive SQL是一种类SQL语言,与关系型数据库所支持的SQL语法存在微小的差异。本文对比MySQL和Hive所支持的SQL语法,发现相同的SQL语句在Hive和MySQL中输出结果的会有所不同。

两个整数除

除法是SQL引擎难以解释的算术运算。如果将两个整数相加,相减或相乘,则始终会得到一个整数。值得注意的是,如果将两个整数相除,不同的SQL查询引擎输出的结果不尽相同。在Hive和MySQL中,运算两个整数相除,输出的结果都是decimal类型。

-- Hive中查询
select 10/3       -- 输出:3.3333333333333335
-- 在MySQL中查询
select 10/3       -- 输出:3.3333

如果使用下面的方式,则会返回整形类型

-- Hive中查询
select 10 div 3       -- 输出:3
-- 在MySQL中查询
select 10 div 3       -- 输出:3

区分大小写

当我们比较两个字符串时,在不同的SQL引擎会产生不同的结果。需要注意的是,在字符串比较中,Apache Hive是区分大小写,看下面的例子。

-- Hive中查询
select 'Bigdata' = 'bigdata'   -- 输出false
-- 在MySQL中查询
select 'Bigdata' = 'bigdata'  -- 输出1

可以看出:相同的SQL语句,如果使用MySQL,则同一查询将返回1,因为在进行字符串比较时MySQL不区分大小写。这意味着只要它们具有相同的字母,MySQL便会将两个字符串解释为相同的字符串。

我们再来看一下另外一个现象,当我们把表名写成大写的,会出现什么现象呢?

这取决于所使用的SQL引擎,在引用数据库中的表时需要注意区分大小写。如果使用Hive,则在引用表时无需担心大小写,因为它们始终将字母转换为小写字母。但是在MySQL中会报1146 - Table 'XX' doesn't exist的错误。

-- 假设Hive、MySQL中有一张test表
-- 在Hive中查询
select * from Test   -- 正常输出结果
-- 在MySQL中查询
select * from Test   -- 报错:1146 - Table 'Test' doesn't exist

在GROUP BY中使用别名

假设有如下查询:

-- 使用别名,在Hive中查询
-- 报错Error while compiling statement: FAILED: SemanticException [Error 10004]: line 7:9 Invalid table alias or column reference 'inventory_status': (possible column names are: userid, visitdate, visitcount)
SELECT CASEWHEN visicount > 5 THEN "more than 5"ELSE "less than 5"END AS inventory_status,count(*) AS cnt
FROM test
GROUP BY inventory_status-- 不使用别名,如果使用下面的语句,则会正常输出结果
SELECT CASEWHEN visitcount > 5 THEN "more than 5"ELSE "less than 5"END AS inventory_status,count(*) AS cnt
FROM test
GROUP BY CASEWHEN visitcount > 5 THEN "more than 5"ELSE "less than 5"END

相同的查询语句在MySQL中进行查询,会正常输出结果。

非数值类型的字符串转为数值类型

使用SQL,我们可以使用CAST命令转换表中列的数据类型。如果要将字符串列转换为整数,可以执行以下操作。

SELECT CAST(column_name AS INT) FROM table_name

那么,如果我们将一个非数值类型的字符串转为数值类型,会出现什么样的结果呢?

-- 在Hive中查询
select cast("bigdata" as int) -- 返回null
-- 在MySQL中查询
select cast("bigdata" as signed int)  -- 返回0

Hive中的视图与SQL查询语句

当我们在Hive中创建视图时,其底层是将视图对应的SQL语句存储到了一张表中的某个字段中,以Hive为例,其元数据中存在下面的一张表:

CREATE TABLE `TBLS` (`TBL_ID` bigint(20) NOT NULL,`CREATE_TIME` int(11) NOT NULL,`DB_ID` bigint(20) DEFAULT NULL,`LAST_ACCESS_TIME` int(11) NOT NULL,`OWNER` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,`OWNER_TYPE` varchar(10) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,`RETENTION` int(11) NOT NULL,`SD_ID` bigint(20) DEFAULT NULL,`TBL_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,`TBL_TYPE` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,`VIEW_EXPANDED_TEXT` mediumtext CHARACTER SET utf8,`VIEW_ORIGINAL_TEXT` mediumtext CHARACTER SET utf8,`LINK_TARGET_ID` bigint(20) DEFAULT NULL,PRIMARY KEY (`TBL_ID`),UNIQUE KEY `UNIQUETABLE` (`TBL_NAME`,`DB_ID`),KEY `TBLS_N50` (`SD_ID`),KEY `TBLS_N49` (`DB_ID`),KEY `TBLS_N51` (`LINK_TARGET_ID`),CONSTRAINT `TBLS_FK1` FOREIGN KEY (`SD_ID`) REFERENCES `SDS` (`SD_ID`),CONSTRAINT `TBLS_FK2` FOREIGN KEY (`DB_ID`) REFERENCES `DBS` (`DB_ID`),CONSTRAINT `TBLS_FK3` FOREIGN KEY (`LINK_TARGET_ID`) REFERENCES `TBLS` (`TBL_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

上面的这张表存储了Hive中表和视图的元数据信息,如果创建一张视图,则VIEW_EXPANDED_TEXT字段与VIEW_ORIGINAL_TEXT字段存储了视图对应的SQL语句。

当我们使用下面的SQL语句创建视图或者直接执行时,可能会出现不一样的结果:

create view as select * from test where name like "%大数据"

如果是直接执行SQL语句,则会按照条件筛选出想要的结果。但是,如果是创建视图,则可能不会出现想要的结果。上面提到,视图对应的SQL语句是作为一个字段存储到Hive的元数据中的,对应其中的一张表。如上面的SQL语句,**like "%大数据"**中包含中文,该中文字符会出现乱码现象,即存储到表中时会变成下面的形式:

create view as select * from test where name like "???"

解决上面的问题很简单,只需要修改元数据中该字段的编码即可:

ALTER TABLE `TBLS` MODIFY COLUMN VIEW_EXPANDED_TEXT mediumtext CHARACTER SET utf8;
ALTER TABLE `TBLS` MODIFY COLUMN VIEW_ORIGINAL_TEXT mediumtext CHARACTER SET utf8;

总结

本文分享了Hive使用过程中存在的一些问题,并给出了相对应的示例,我们在使用的过程中可以留意一下这些问题,对比相同的SQL语句在MySQL和Apache Hive上的结果上的不同。

- END -

扫描下方二维码

添加好友,备注【交流群

拉你到学习路线和资源丰富的交流群

工作中使用Hive SQL的几个知识点(建议收藏)相关推荐

  1. Hive SQL 语法大全 整理(建议收藏)

    链接 https://mp.weixin.qq.com/s/dYL_JqbC7DXgP0lc9pSQiA 一.DDL 操作 注:SCHEMA/DATABASE 是相同的概念,只是叫法不同而已 -- 创 ...

  2. 在工作中常用的sql语句

    这个是我以前在工作中常用的一些SQL语句,里面大部分都是从其他网站上找的,只有部分是自己在工作中解决问题事记录的,现在一起贴出来跟大家分享下,其实很多时候看看别人的经验总结和技术的理解,会使自己少走很 ...

  3. 工作中使用的sql知识点及查询语法

    文章目录 只修改字段属性时用modify 设置默认值 删除默认值 修改表名 修改字段位置 查看创建表的语句 复制其他表的数据并插入到该表中 完全复制表以及内容 判断内容并显示 :IF (xxx=xxx ...

  4. create报错不是函数_各种SQL中关于日期函数的那些事(建议收藏)

    hive.presto.spark.impala.mysql常用日期时间函数吐血整理 使用的SQL多了不知道大家有没这样的困惑,SQL的语法在大多数方面是一致的,如SELECT,JOIN,GROUP ...

  5. JVM(7)内存溢出问题(工作中常用、面试也重要的知识点)

    内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存.这篇文章整理自<深入理解java虚拟机>.因为内存溢出问题不仅是工作中的一 ...

  6. 如何在工作中保持稳定的情绪? – 个人看法和建议

    文章目录 每日一句正能量 前言 情绪波动的原因 建议 情绪调节技巧和策略 身处逆境,如何治愈自己 后记 每日一句正能量 所谓的快乐,是指身体的无痛苦和灵魂的无纷扰.--伊壁鸠鲁 前言 在工作中保持稳定 ...

  7. SQL常用脚本整理,建议收藏

    工作中有许多比较常用的SQL脚本,今天开始分几章分享给大家. 1.行转列的用法PIVOT CREATE table test (id int,name nvarchar(20),quarter int ...

  8. 20个经典函数细说 Pandas 中的数据读取与存储,强烈建议收藏

    作者 | 俊欣 来源 | 关于数据分析与可视化 大家好,今天小编来为大家介绍几个Pandas读取数据以及保存数据的方法,毕竟我们很多时候需要读取各种形式的数据,以及将我们需要将所做的统计分析保存成特定 ...

  9. 项目经理工作全清单,从签合同到竣工,建议收藏

    合同签订阶段 阶段性工作 ★合同和技术协议签订 ★工程预付款 项目经理的任务 ●参与合同和技术协议的谈判 ●申请.办理工程预付款接收 项目部成立阶段 阶段性工作 ★组建项目组 ★制定项目目标策划 项目 ...

最新文章

  1. 修改远程桌面连接3389端口号
  2. linux ttyusb读写_linux下非root用户获得devttyUSB0的读写权限
  3. 几个常见的Python面试题分享,帮你顺利求职
  4. Qt Creator设置3D组件属性
  5. Deep Compression阅读理解及Caffe源码修改
  6. win8.1自带metro应用不工作解决办法
  7. 设计模式(二)构建型模式
  8. c改java_如何将一个c程序改写成JAVA程序
  9. 初涉springboot(一)
  10. Json与List的相互转换 [谷歌的Gson.jar和阿里的fastJson.jar]
  11. 让线程按顺序执行8种方法
  12. Apache Hadoop 2.4.1完全分布式集群安装
  13. android短信安全,基于Android短信服务的手机安全监控系统的设计与实现
  14. eclipse mysql tomcat,java+eclipse+tomcat+mysql+jdbc
  15. STM32F103 读写内部FLASH—学习笔记(野火)
  16. Linux 命令积累(当作笔记)
  17. 【搜索算法】八数码问题的多种解法
  18. 【图】【热传】安全漏洞破解的奇迹
  19. 肿瘤细胞膜包裹纳米颗粒|MIA-PaCa-2胰腺癌细胞膜纳米金颗粒|使用周期:6-12个月
  20. SAP FI 应收应付账龄分析-功能研究

热门文章

  1. 浅谈EPC模式下业主方的全过程投资管控措施
  2. Android 中的混音器 AudioMixer 实现分析
  3. 第4讲 Android Camera2 API Open/Close Camera流程
  4. 南卡和小米蓝牙耳机哪款更值得入手?400以下蓝牙耳机深度测评对比
  5. 微信小程序选择内容显示相应内容
  6. android 8.0闹钟服务,安卓8.0现闹恼人Bug:闹铃不响 用户集体上班迟到
  7. 第一篇:飞镖自动靶的设想与实践
  8. 康威定律——微服务的理论基础
  9. ai智能写作助手-ai自动写作软件
  10. 3D游戏引擎原理简介