hivesql有没有控制流程的语法(hive sql基本操作描述正确的是)

技术Hive sql使用注意事项有哪些这篇文章给大家分享的是有关Hive sql使用注意事项有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言在进行数仓搭建和数据分析时最常用的就是 sq

本文就跟大家分享一下使用Hive sql的注意事项有哪些。我觉得边肖很实用,就和大家分享一下作为参考。让我们跟着边肖看一看。

00-1010 sql是数据仓库构建和数据分析中最常用的方法。它的语法简洁易懂。目前大数据领域的几个主流框架都支持sql语法,包括hive、spark、flink等。所以sql在大数据领域有着不可替代的作用,我们需要重点关注它。

如果您不熟悉或不小心使用sql,在查询分析中很容易出错。接下来,让我们看看几个容易出错的sql语句和注意点。

00-

前言
正文开始

hive不仅支持int、double、string等常用类型,还支持decimal类型,用于在数据库中存储准确的数值,常用于表示金额的字段。

注意事项:

例如十进制(11,2)表示最多11位,其中后2位为十进制,整数部分为9位;

如果整数部分超过9位,则这个字段就会变成null,如果整数部分不超过9位,则原字段显示;

如果小数部分不足2位,则后面用0补齐两位,如果小数部分超过两位,则超出部分四舍五入;

也可以直接写小数,不指定位数。默认值为十进制(10,0)整数,10位数,无小数。

00-1010创建表时,可以使用location指定文件或文件夹创建表tu(白痴,名称字符串)位置'/user/stu 2 ';注意事项:

创建表格时使用位置,

指定文件夹时,hive会加载文件夹下的所有文件,当表中无分区时,这个文件夹下不能再有文件夹,否则报错。

当表是分区表时,如partitioned by (day string),该文件夹下的每个文件夹都是一个分区,文件夹名为day=20201123。

然后使用这种格式:msck repair table score;在修复表结构之后,您可以看到所有的数据都已经加载到表中。

00-1010从hdfs加载文件loaddatainpath '/hive data/techer . CSV ' into table techer ';

将文件loaddatalocalinpath '/user/test/techer . CSV '加载到tabletecher中;注意事项:

使用本地负载数据来表示从本地文件系统加载,文件会拷贝到hdfs上.

用load数据表示从hdfs文件系统加载,文件会直接移动到hive相关目录下,注意不要复制过去,因为hive认为hdfs文件已经有3个副本了,没有必要再复制一次。

如果该表是分区表,如果加载时未指定分区,将会报告错误。

如果加载了具有相同文件名的文件,它将被自动重命名。

00-1010删除表操作droptablescore1

空表操作截断了表2;注意事项:

如果hdfs 开启了回收站,drop 删除的表数据是可以从回收站恢复的,表结构无法恢复,则需要重新创建。truncate 清空的表是不进回收站的,所以无法恢复truncate清空的表。

因此,必须谨慎使用截断。一旦清除,除了物理恢复,它将无能为力。

1. decimal

INNERJOIN内部联接:只有匹配联接条件的数据存在于要联接的两个表中,这两个表将被保留。选择* from techert[inner]join course cont . t _ id=c . t _ id;- inner可以省略LEFTO。

UTER JOIN 左外连接:左边所有数据会被返回,右边符合条件的被返回select * from techer t left join course c on t.t_id = c.t_id; -- outer可省略RIGHT OUTER JOIN 右外连接:右边所有数据会被返回,左边符合条件的被返回、select * from techer t right join course c on t.t_id = c.t_id;

FULL OUTER JOIN 满外(全外)连接: 将会返回所有表中符合条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用NULL值替代。SELECT * FROM techer t FULL JOIN course c ON t.t_id = c.t_id ;

注意事项:

  1. hive2版本已经支持不等值连接,就是 join on条件后面可以使用大于小于符号;并且也支持 join on 条件后跟or (早前版本 on 后只支持 = 和 and,不支持 > < 和 or)

  2. 如hive执行引擎使用MapReduce,一个join就会启动一个job,一条sql语句中如有多个join,则会启动多个job

注意:表之间用逗号(,)连接和 inner join 是一样的,例:

select tableA.id, tableB.name from tableA , tableB where tableA.id=tableB.id;   
和   select tableA.id, tableB.name from tableA join tableB on tableA.id=tableB.id;

它们的执行效率没有区别,只是书写方式不同,用逗号是sql 89标准,join 是sql 92标准。用逗号连接后面过滤条件用 where ,用 join 连接后面过滤条件是 on。

6. left semi join
为什么把这个单独拿出来说,因为它和其他的 join 语句不太一样,
这个语句的作用和 in/exists 作用是一样的,是 in/exists 更高效的实现SELECT A.* FROM A where id in (select id from B)SELECT A.* FROM A left semi join B ON A.id=B.id

上述两个 sql 语句执行结果完全一样,只不过第二个执行效率高

注意事项:

  1. left semi join 的限制是:join 子句中右边的表只能在 on 子句中设置过滤条件,在 where 子句、select 子句或其他地方过滤都不行。

  2. left semi join 中 on 后面的过滤条件只能是等于号,不能是其他的。

  3. left semi join 是只传递表的 join key 给 map 阶段,因此left semi join 中最后 select 的结果只许出现左表

  4. 因为 left semi join 是 in(keySet) 的关系,遇到右表重复记录,左表会跳过

7. 聚合函数中 null 值
hive支持 count(),max(),min(),sum(),avg() 等常用的聚合函数

注意事项:

聚合操作时要注意 null 值

count(*) 包含 null 值,统计所有行数;
count(id) 不包含id为 null 的值;
min 求最小值是不包含 null,除非所有值都是 null;
avg 求平均值也是不包含 null

以上需要特别注意,null 值最容易导致算出错误的结果

8. 运算符中 null 值
hive 中支持常用的算术运算符(+,-,*,/)  
比较运算符(>, <, =)
逻辑运算符(in, not in)

以上运算符计算时要特别注意 null 值

注意事项:

  1. 每行中的列字段相加或相减,如果含有 null 值,则结果为 null
    例:有一张商品表(product)

id price dis_amount
1 100 20
2 120 null

各字段含义: id (商品id)、price (价格)、dis_amount (优惠金额)

我想算每个商品优惠后实际的价格,sql如下:

select id, price - dis_amount as real_amount from product;

得到结果如下:

id real_amount
1 80
2 null

id=2的商品价格为 null,结果是错误的。

我们可以对 null 值进行处理,sql如下:

select id, price - coalesce(dis_amount,0) as real_amount from product;

使用 coalesce 函数进行 null 值处理下,得到的结果就是准确的

coalesce 函数是返回第一个不为空的值
如上sql:如果dis_amount不为空,则返回dis_amount,如果为空,则返回0
  1. 小于是不包含 null 值,如 id \< 10;是不包含 id 为 null 值的。

  2. not in 是不包含 null 值的,如 city not in ('北京','上海'),这个条件得出的结果是 city 中不包含 北京,上海和 null 的城市。

9. and 和 or

在sql语句的过滤条件或运算中,如果有多个条件或多个运算,我们都会考虑优先级,如乘除优先级高于加减,乘除或者加减它们之间优先级平等,谁在前就先算谁。那 and 和 or 呢,看似 and 和 or 优先级平等,谁在前先算谁,但是,and 的优先级高于 or

注意事项:

例:
还是一张商品表(product)

id classify price
1 电器 70
2 电器 130
3 电器 80
4 家具 150
5 家具 60
6 食品 120

我想要统计下电器或者家具这两类中价格大于100的商品,sql如下:

select * from product where classify = '电器' or classify = '家具' and price>100

得到结果

id classify price
1 电器 70
2 电器 130
3 电器 80
4 家具 150

结果是错误的,把所有的电器类型都查询出来了,原因就是 and 优先级高于 or,上面的sql语句实际执行的是,先找出 classify = '家具' and price>100 的,然后在找出 classify = '电器' 的

正确的 sql 就是加个括号,先计算括号里面的:

select * from product where (classify = '电器' or classify = '家具') and price>100

感谢各位的阅读!关于“Hive sql使用注意事项有哪些”这篇文章就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/148502.html

(0)

相关推荐

  • python函数应用范例

    技术python函数应用范例这篇文章主要讲解了“python函数应用范例”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python函数应用范例”吧!如何定义一个函数函数也

    攻略 2021年11月9日
  • java语言软件开发工具包是什么(使用java语法的脚本语言)

    技术四种Java脚本语言对比的示例分析小编给大家分享一下四种Java脚本语言对比的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在一些

    攻略 2021年12月20日
  • LARAVEL AJAX简单跨域的示例分析

    技术LARAVEL AJAX简单跨域的示例分析本篇文章为大家展示了LARAVEL AJAX简单跨域的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。//前端 <scri

    攻略 2021年10月21日
  • 中庸,大家对中庸知道有什么见解

    技术中庸,大家对中庸知道有什么见解儒家经典《中庸》说:“‘’尊德性而道问学,致广大而尽精微,极高明而道中庸,”极高明而道中庸的境界在我们平凡的生活中就可以达到,那就是永保内心的安静中庸、忌急功近利、永不骄不躁、不大喜亦不

    生活 2021年10月23日
  • 【Hadoop报错】The directory item limit of /tmp/hadoop-yarn/staging/history/doneintermediate/hdfs is exceeded: limit=1048576 items=1048576

    技术【Hadoop报错】The directory item limit of /tmp/hadoop-yarn/staging/history/doneintermediate/hdfs is exceeded: li

    礼包 2021年12月1日
  • MySQL数据库索引和事务的作用是什么

    技术MySQL数据库索引和事务的作用是什么本篇内容主要讲解“MySQL数据库索引和事务的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL数据库索引和事务的作

    攻略 2021年12月8日