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

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

sinye56 2024-09-22 08:32 5 浏览 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)


相关推荐

RHEL8和CentOS8怎么重启网络

本文主要讲解如何重启RHEL8或者CentOS8网络以及如何解决RHEL8和CentOS8系统的网络管理服务报错,当我们安装好RHEL8或者CentOS8,重启启动网络时,会出现以下报错:...

Linux 内、外网双网卡路由配置

1.路由信息的影响Linux系统中如果有多张网卡的情况下,如果路由信息配置不正确,...

Linux——centos7修改网卡名

修改网卡名这个操作可能平时用不太上,可作为了解。修改网卡默认名从ens33改成eth01.首先修改网卡配置文件名(建议将原配置文件进行备份)...

CentOS7下修改网卡名称为ethX的操作方法

?Linux操作系统的网卡设备的传统命名方式是eth0、eth1、eth2等,而CentOS7提供了不同的命名规则,默认是基于固件、拓扑、位置信息来分配。这样做的优点是命名全自动的、可预知的...

Linux 网卡名称enss33修改为eth0

一、CentOS修改/etc/sysconfig/grub文件(修改前先备份)为GRUB_CMDLINE_LINUX变量增加2个参数(net.ifnames=0biosdevname=0),修改完成...

CentOS下双网卡绑定,实现带宽飞速

方式一1.新建/etc/sysconfig/network-scripts/ifcfg-bond0文件DEVICE=bond0IPADDR=191.3.60.1NETMASK=255.255.2...

linux 双网卡双网段设置路由转发

背景网络情况linux双网卡:网卡A(ens3)和网卡B(...

Linux-VMware设置网卡保持激活

Linux系统只有在激活网卡的状态下才能去连接网络,进行网络通讯。修改配置文件(永久激活网卡)...

VMware虚拟机三种网络模式

01.VMware虚拟机三种网络模式由于linux目前很热门,越来越多的人在学习linux,但是买一台服务放家里来学习,实在是很浪费。那么如何解决这个问题?虚拟机软件是很好的选择,常用的虚拟机软件有v...

Rocky Linux 9/CentOS Stream 9修改网卡配置/自动修改主机名(实操)

推荐...

2023年最新版 linux克隆虚拟机 解决网卡uuid重复问题

问题描述1、克隆了虚拟机,两台虚拟机里面的ip以及网卡的uuid都是一样的2、ip好改,但是uuid如何改呢?解决问题1、每台主机应该保证网卡的UUID是唯一的,避免后面网络通信有问题...

Linux网卡的Vlan配置,你可能不了解的玩法

如果服务器上连的交换机端口已经预先设置了TRUNK,并允许特定的VLAN可以通过,那么服务器的网卡在配置时就必须指定所属的VLAN,否则就不通了,这种情形在虚拟化部署时较常见。例如在一个办公环境中,办...

Centos7 网卡绑定

1、切换到指定目录#备份网卡数据cd/etc/sysconfig/network-scriptscpifcfg-enp5s0f0ifcfg-enp5s0f0.bak...

Linux搭建nginx+keepalived 高可用(主备+双主模式)

一:keepalived简介反向代理及负载均衡参考:...

Linux下Route 路由指令使用详解

linuxroute命令用于显示和操作IP路由表。要实现两个不同子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该...

取消回复欢迎 发表评论: