导航:首页 > 净水问答 > hive过滤掉数字开头

hive过滤掉数字开头

发布时间:2021-12-22 17:11:55

⑴ 如何用数字 取hive表某列值

Hive的insert语句能够从查询语句中获取数据,并同时将数据Load到目标表中。现在假定有一个已有数据的表staged_employees(雇员信息全量表),所属国家cnty和所属州st是该表的两个属性,我们做个试验将该表中的数据查询出来插入到另一个表employees中。

INSERT OVERWRITE TABLE employees
PARTITION (country = '中国', state = '北京')
SELECT * FROM staged_employees se
WHERE se.cnty = '中国' AND se.st = '北京';

由于使用了OVERWRITE关键字,目标表中原来相同partition中的所有数据被覆盖,如果目标表中没有partition,则整个表会被覆盖。

如果把OVERWRITE关键字删掉,或者替换成INTO,则hive会追加而不是替代原分区或原表中的数据,这个特性在Hive v0.8.0之后才支持。

当数据已经存在于hdfs上但不是我们想要的格式的时候,当进行的计算需要分好多步骤有必要存储中间数据的时候,或者原数据没有分区、有很多无效列需要过滤的时候,可以使用insert..select句型来完成这一转换过程。

由于一个国家有很多个省份,如果想根据(国家country,地区partition)两个维度对数据进行分区的话,这条SQL语句的执行个数应该等于地区的数目,比如中国有23个省就要对该SQL语句执行23次。因此hive对这个SQL语句进行了改造,只需要扫描一次原表就可以生成不同的输出(多路输出)。比如下面的SQL语句扫描了一次原始数据表,但是同时生成了3个省份的结果数据:

FROM staged_employees se
INSERT OVERWRITE TABLE employees
PARTITION (country = '中国', state = '河北省')
SELECT * WHERE se.cnty = '中国' AND se.st = '河北省'
INSERT OVERWRITE TABLE employees
PARTITION (country = '中国', state = '陕西省')
SELECT * WHERE se.cnty = '中国' AND se.st = '陕西省'
INSERT OVERWRITE TABLE employees
PARTITION (country = '中国', state = '河南省')
SELECT * WHERE se.cnty = 'US' AND se.st = '河南省';通过缩进可以很清楚的看到,我们扫描了一次staged_employees表但是执行了3次不同的insert语句,这条大SQL语句是这么执行的:先通过from staged_employees表获取一条记录,然后执行每一个select子句,如果select子句验证通过则执行相应的insert语句。注意这里的三条select子句是完全独立执行的,并不是if .. then .. else的关系,这就意味着这3条select子句在某种情况下可能同时通过where检测。

通过这种结构,原始表的数据能被拆分到目标表的不同partition中去。

如果原表的一条记录满足于其中一个给定的select .. where .. 子句,则该记录将被写到目标表的固定分区中。其实更进一步,每条Insert语句能将数据写到不同的数据表中,不管这个表是否分区都一样。

于是,就像一个过滤器一样,原表的一些数据被写到了很多输出地址,而剩下的数据会被丢弃。

当然,你也可以混用Insert overwrite和insert into两种不同的方法写出数据。

向动态分区插入数据

但是问题还是没有解决,中国有23个省,那么我们就需要写23个insert into .. select ..where子句,这非常不现实。于是hive的一种叫做动态分区的特性就出现了,它能够根据select出来的参数自动推断将数据插入到那个分区中去。本文上面的两种SQL语句设定分区的方式都叫做静态分区插入。

将上一个SQL语句进行改动,会得到以下简洁的新SQL语句:

INSERT OVERWRITE TABLE employees
PARTITION (country, state)
SELECT ..., se.cnty, se.st
FROM staged_employees se;hive先获取select的最后两个位置的se.cnty和se.st参数值,然后将这两个值填写到Insert语句partition中的两个country和state变量中,即动态分区是通过位置来对应分区值的。原始表select出来的值和输出partition的值的关系仅仅是通过位置来确定的,和名字并没有关系,比如这里se.cnty和county的名称完全没有关系。

上面的这条SQL语句是对两个分区同时进行了动态设定,如果staged_employees表中有100个国家,每个国家有100个地区,那么该SQL语句自动对每个国家和地区建立相应的partition并插入数据,如果用手写的话不现实。

只要位置正确,你可以混用动态分区和静态分区值设定,比如下面这个例子,你可以静态指定一个country值,但是state值采用动态的方法设定:

INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state)
SELECT ..., se.cnty, se.st
FROM staged_employees se
WHERE se.cnty = 'US';注意:静态分区值必须在动态分区值的前面!

⑵ Hive 如何利用regexp_extract函数提取数字

case
--处理非科学计数法表示的字符串
when length(regexp_extract('字符串','([0-9]+\\.)([0-9]+)(E-*[0-9]+)',2))=0
then '字符串'
--处理整数
when length(regexp_extract('字符串','([0-9]+\\.)([0-9]+)(E[0-9]+)',2))<=cast(regexp_extract('字符串','(E)([0-9]+)',2) as int)
then rpad(regexp_replace(regexp_extract('字符串','([^E]+)',1),'\\.',''),cast(regexp_extract('字符串','(E)([0-9]+)',2) as int)+1,'0')
--处理小数

⑶ hive如何去掉重复数据,显示第一条

去重没问题啊,distinct 就好了,显示第一条可以用row_number函数,不同版本hive的row_number有所不同,你自己查一下吧,row_number可以对同一个key从1开始编号的。

⑷ HIve中SQL如何判断一个字段是连续10个数字

目前我知道的方法是把你希望添加的数据写入到文本中,然后从文本导入到你的表格中。
但是,hive不知道oracle的insert into , update。
load data [local] inpath 'yourfile_location' [overwrite] into your_table;

⑸ HIVE 字符串截取

select split(id,",")[0],split(id,",")[1],,,split(id,",")[4],,,,

⑹ hive 分区列是根据哪个列数据进行过滤的

insert overwrite table t_table1 select * from t_table1 where XXXX;

其xxx需要保留数据查询条件

清空表:
insert overwrite table t_table1 select * from t_table1 where 1=0;

⑺ hive 正则匹配是否含有字母

hive中用的就是java的正则
.*\\w+.*

⑻ hive中正则表达式怎么写

有的,like其实不是正则,而是通配符,这个通配符可以看一下SQL的标准。例如%代表任意多个字符。
A like '123%'
要是not like使用 not A like '123%'

若是在hive想用正则,请用rlike,不过hive的正则写法和java一样,\请使用\\,例如数字\d,在这需要写成\\d
A rlike '\\d+'
not A rlike '\\d+'

⑼ hive中split函数怎么把一段话中的数字提取出来

PIG中输入输出分隔符默认是制表符\t,而到了hive中,默认变成了八进制的\001, 也就是ASCII: ctrl - A Oct Dec Hex ASCII_Char 001 1 01 SOH (start of heading) 官方的解释说是尽量不和文中的字符重复,因此选用了 crtrl - A,单个的字符可以

⑽ hive 能去掉字符中间的空格吗

用replace函数替换 Replace() 功能将一个字符串中指定个数的字符串替换为另一个字符串。 语法Replace(string1,start,n,string2) 参数string1:string类型,指定要使用string2替换其中一部分内容的字符串start:long类型,指定要从哪个字符位置开始替换字符串,字符串中第一个字符的位置为1n:long类型,指定要替换多少个字符string2:string类型,指定用哪个字符串替换string1的部分字符返回值String。函数执行成功时返回替换后的字符串,发生错误时返回空字符串("")。如果任何参数的值为NULL,Replace()函数返回NULL。用法如果start参数指定的位置超过了string1的长度,那么Replace()函数把将string2拼接到string1的后面形成的字符串返回。如果n的值为0,那么Replace()函数把string2插入到string1指定位置后形成的字符串返回。 多个空格时要循环替换。 DOWHILEPOS(STRING1,'')>0 REPLACE(STRING,POS(STRING1,''),1,'') LOOP 其中,string1为要去空格的字符串 楼上的,想问一下,用pos真的可以判断出''来吗? ''中间党然有一个空�...

阅读全文

与hive过滤掉数字开头相关的资料

热点内容
淳净空间净化器多少钱 浏览:800
iam空气净化器换了过滤网后怎么复位 浏览:878
25寸电动污水泵多少钱 浏览:535
厌氧废水的氧化还原电位 浏览:897
长春市污水处理工上岗证 浏览:359
牙齿纳米镀膜树脂贴面 浏览:353
净水器需要从哪里放水 浏览:811
超滤反洗的步骤 浏览:591
14款汉兰达汽油滤芯怎么换 浏览:619
工业纯水机要怎么选 浏览:171
空气净化器进水了怎么办 浏览:707
原神纯水精灵bug怎么打 浏览:56
钢丸钢砂过滤 浏览:501
氯碱工业产生的废水如何处理 浏览:567
空气净化器开不了机是什么问题 浏览:403
纳滤流程图 浏览:803
家用ro膜每次反冲洗多久好 浏览:674
太原淀粉污水处理设备多少钱 浏览:807
大型净水机设备排多少废水 浏览:527
环氧乙烯树脂怎么洗 浏览:336