百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

Impala工作常用函数和诡异bug问题总结[1]

sinye56 2024-09-22 08:32 13 浏览 0 评论

一、引入:

Impala是什么在这里我不做解释,只对impala实际工作中所遇到的问题和常用的函数做一个总结。

二、Impala常用函数

<一>drop,truncate,delete区别

1、drop (删除表):删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表。

drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。

2、truncate (清空表中的数据):删除内容、释放空间但不删除定义(保留表的数据结构)。与drop不同的是,只是清空表数据而已。

注意:truncate 不能删除行数据,要删就要把表清空。

3、delete (删除表中的数据):delete 语句用于删除表中的行。delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存

以便进行进行回滚操作。

truncate与不带where的delete :只删除数据,而不删除表的结构(定义)

4、truncate table 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用delete。

如果要删除表定义及其数据,请使用 drop table 语句。

5、对于由foreign key约束引用的表,不能使用truncate table ,而应使用不带where子句的delete语句。由于truncate table 记录在日志中,所以它不能激活触发器。

6、执行速度,一般来说: drop> truncate > delete。

7、delete语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。

truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。


<二>NVL()函数

NVL(表达式1,表达式2)


如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值。 该函数的目的是把一个空值(null)转换成一个实际的值。其表达式的值可以是数字型、字符型和日期型。但是表达式1和表达式2的数据类型必须为同一个类型。


<三>instr()和

instr(c1,c2,i,j) 在一个字符串中搜索指定的字符,返回发现指定的字符的位置;


c1 被搜索的字符串


c2 希望搜索的字符串


i 搜索的开始位置,默认为1


j 出现的位置,默认为1


SQL> select instr("abcde",'b');

e",'b');

结果是2,即在字符串“abcde”里面,字符串“b”出现在第2个位置。如果没有找到,则返回0;不可能返回负数

简单一句就是:instr函数返回字符串str中子字符串substr第一次出现的位置,在sql中第一字符的位置是1,如果 str不含substr返回0。

substr()函数

1、作用:用来截取数据库某个字段中的一部分。

2、语法:substr(string,start,length)

string参数:必选。数据库中需要截取的字段。

start参数:必选。正数,从字符串指定位子开始截取;

负数,从字符串结尾指定位子开始截取;

0,在字符串中第一个位子开始截取。1,同理。(特殊)

length参数:可选。需要截取的长度。缺省,即截取到结束位置。

注意:若必选参数为空,那返回的结果也为空。

3、简单示例:substr('123456',3,2); 结果是--34

substr('123456',-3,2); 结果是--45

substr('123456',0,2); 特殊,与下同

substr('123456',1,2); 结果同为--12

4、补充:在各个数据库的函数名称略有差异。

MySQL--substr()或substring()

Oracle--substr()

SQL Server--substring()

5、提示:①与java类中的substring()名称相似,但方法不同,千万别混淆。

②substr()函数截取字符串的*内容*;

与之比较--instr()函数是截取的字符串在源字符串中的*位子*。

<四>时间转换问题 from_unixtime() ,unix_timestamp()

Select unix_timestamp();

这里将会直接返回从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。

配合from_unixtime()可以转换成需要的日期格式

用法实例1: select from_unixtime(unix_timestamp(),'yyyyMMdd HH:mm:ss') as update_time --更新时间

这个可以用来作为每行记录值更新的时间。


<五>时间函数to_date(timestamp date)

从时间戳值返回日期字段的字符串表示形式。

示例:select to_date(‘2020-05-15 10:45:01’);将会返回2020-05-15


<六>时间函数from_timestamp()

将指定的时间戳转换为具有给定格式的字符串。

示例:

select from_timestamp(to_date('2020-05-15 10:45:01'),'yyyy/MM/dd')

返回:

2020/05/15

<七>对记录值后有备注内容有括号,需要去除备注内容,也就是去括号操作

Select case when cast(instr(user_reason,'(',1) as int)=0 then user_reason else substr(user_reason,1,instr(user_reason,'(',1)-1 ) end


上面这段sql的意思是,如果user_reason该字段没有括号内容,那就返回原字段,如果user_reason该字段有括号,那就去错括号开始后面的所有内容。这段sql语句的操作可以用来作为很多方面对记录值的截取和清晰

实例:如果user_reason=’cat’ 那就上面的sql就直接返回cat

如果 user_reason=’home(mouse)’那就上面的sql就直接返回home


<八>去重问题与及三逻辑语法

1、关于distinct去重:这是针对一张表的内部数据去重。比如使用distinct *,是针对整张表内部数据去重。

2、关于union去重:这是针对两张表之间数据去重,并且排序。并不会去重每张表之间重复的数据。


简单的说就是distinct是对内去重,union是对外去重并且排序,合并表。

Union all 不去重也不排序进行合并。


3、关于两张表数据去重:

where 1 = 1

and not exists( select 1 from 第二张表s2

where 第一张表主键= 第二张表主键 )

这段sql表达,是说如果第一张表内有第二张表的数据,就不要,只取第一张表独有的数据。

4、sql三逻辑语法问题:简单说的就是,sql里并不是非黑即白的逻辑判断。

比如,一个字段test,有三种状态,分别是1,0,null


1>如果语法写:where test <>1

其所过滤的结果是,只会留下0,会过滤1和null值


2>如果语法写:where test not in (1)

其所过滤的结果是,只会留下0,会过滤1和null值

所以sql语法在写时,尽量的枚举所有的状态,而不是取反。如果取反会过滤空值,这会导致数据减少。当然也可以利用取反可以过滤空值的特性来去除空值一种逻辑写法。


三逻辑贯穿整个sql,也包括其他sql引擎


三、Impala诡异bug

<1>偶尔丢失一两条数据问题:

描述:在报表中检查发现一个字段少了一条数据,进行问题排查,追溯到源数据上,发现select查出来有数据,但是在调度里insert插入进去变成空值或没有数据。如果是全部没有数据也好理解,可能系统奔溃了,重新搭建就是。但奇怪的是,其它值插入进去就正常,却偏偏这个字段这一条数据发生了丢失。这简直就是要挠墙的结果啊。


开始我对这个现象很无法理解,因为这是不可能出现的事情,然而发生了。解决肯定要是解决的。查了一下午,最终可以肯定就是查出来这一条数据没有插入进去,变成了空值


后面在检查到建表语句时发现,这个表的存储格式是textfile行式存储,我猜想有没有可能和存储格式有关系呢?于是我就删表重建,采用了parquet列式存储格式。然后重新调度,神奇事情发生了,该字段丢失这一条数据有数据了。


为此可能是Impala对textfile行式存储不大友好,偶尔会发生丢失数据的情况,直接表现就是可以查出来但是就是存入不进去,然后就这么一两条丢失了。这种情况发生时不要慌,先检查建表语句存储格式。建议对所有在impala的表都换成stored as parquet这种格式


<2>substr()截取问题在impala和在hive结果乱码问题

实例:

select substr('【小猫】home',1,4)

比如上面这段sql,这Hive里执行是正常的,但是在impala执行就会乱码。可能你还找不到原因。


这是因为hive里对每个汉字就是一个字符,一个标点也是一个字符;

结果就是:【小猫】


但是impala对每个汉字代表是三个字符,一个英文符号是一个字符如果要保持结果一致的话,就需要这样写:

select substr('【小猫】home',1,8)


相关推荐

6个接私活的网站,你有技术就有钱

如果觉得有帮助,还请大家帮忙多多转发,点个关注作者:发哥链接:GitHubDaily本篇文章会向大家推荐国内外几个接外包比较靠谱的平台,主旨是贵精不贵多。因此,像「猪x戒」这种会让程序员自贬身价,扰乱...

Java开源可商用的CMS建站系统_java建站源码

Java研发的CMS内容管理系统具有许多优势和特点,包括以下几个方面:跨平台性:Java是一种跨平台的编程语言,可以在不同的操作系统上运行,包括Windows、Linux、Mac等。这意味着Java...

SEO新手建站必看&quot;干货&quot;优质空间和功能选择技巧!

一.空间的分类服务器:远程的高级大型计算机。vps:虚拟服务器。虚拟空间:也称虚拟主机云主机:是在一组集群主机上虚拟出多个类似独立主机的部分,集群中每个主机上都有云主机的一个镜像,从而大大提高了虚拟主...

千字长文教你使用 宝塔面板 快速搭建网站

本文将教大家使用宝塔面板快速搭建网站,云服务器购买以及域名注册部分请自行上网搜索了解,亦可留言联系小编进行咨询。如果是和下方一样本地搭建演示的话,则不需要付费购买域名和主机。宝塔面板的是...

BlueHost香港虚拟主机建站的5个优点

应该是从2006年左右开始,如果我们建站选择国内的主机需要备案手续,而且比较繁琐,且根据各地的不同政策还需要到接入点拍照登记个人信息等,一来比较繁琐,二来我们担心万一网站可能存在的信息问题导致不必要的...

10款好用的Linux服务器网站管理面板推荐

如今在建站时,很多人都会使用管理面板来辅助建站,因为相对于手动安装软件,面板更加简单而且高效,即使新手也能很快学会搭建网站,在本文中我们来推荐几款好用的网站管理面板宝塔面板宝塔面板是一款简单好用的网站...

小白拥有一台云服务器到底能干些什么?成就感爆棚的简单方案!

?云服务器是什么?云服务器(比如阿里云、腾讯云等)是提供给用户的一种虚拟服务器资源,你可以把它看作一台“rent的电脑”,只需要支付少量费用就可以拥有一个功能强大的网络设备。对于小白来说,拥有一...

苹果CMS,苹果CMS采集插件,苹果CMS快速建站(图文教程)

苹果CMS,有着强大的管理功能,管理后台界面大方、操作简单、功能齐全、模块众多、双端管理。苹果CMS加上丰富的系统标签,系统内置了丰富的cms标签并支持thinkphp框架标签完美融合,可以调取系统内...

新手搭建网站、小程序、APP等系统,如何选择服务器?

今天和小蔡和大家说说,新手搭建网站,如何选择服务器?废话不多说,直接来干货。服务器是存放网站源代码的容器,也是运行网站程序的工具,所以是不可或缺的。新手刚接触搭建网站,若不知道怎么去选择一台适合自己...

在海外VPS服务器(Hostinger)上配置宝塔面板的操作步骤

不得不说,宝塔面板是真的好用啊~用上就放不下了,一些海外的免费开源的服务器集成面板(比如CloudPanel)我也用了,不喜欢,真的不如宝塔面板方便耐用。今天聊一下在海外服务器(也包括国内服务器,没有...

干货盘点:每个wordpress站长都推荐完成的60个任务清单

构建和运营wordpress网站包含了很多重要任务,遗漏哪一方面都可能造成或大或小的不良后果,因此我们特别整理了这个任务清单,为你查漏补缺,希望能对您现在运营或者即将开始构建的wordpress网站有...

为什么站长喜欢选择BlueHost主机建站

BlueHost正式成立于2003年,从事主机(虚拟主机)业务至今已经将近十余年,无论从口碑还是用户的评价,我们基本很少看到关于Bluehost主机产品和商家负面的评论信息。从2014年开始,Blue...

自助建站时代来临 半小时成建站达人

“H5”意为第五代HTML,即第五代网页编写语言。自从1991年第一代HTML开始研发以来,网页编写、网站建设一直都属于高端技术行业,网站建设人员都是一些专业型人才,这也意味着网站的建设和维护都需要不...

现代化、开源的 Linux 服务器运维管理面板

1Panel是一个现代化、开源的Linux服务器运维管理面板。1Panel的功能和优势包括:快速建站:深度集成Wordpress和Halo,域名绑定、SSL证书配置等一键搞定;高效管理...

[1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

测评介绍本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于do...

取消回复欢迎 发表评论: