从Hive中的文本字符串中获取特定值

时间:2018-04-30 20:44:35

标签: hive hiveql

我需要从Hive表中的下面的文本字符串中获取值5。由于某种原因,我使用的floor和split函数可以获得值“0”和“3”,但我不知道如何在第一个“/”前面获取第一个值:

Column name: logsummary
**Record:5/0/3/0/4/4/143504**

Select 
floor(split(logsummary, '[/]')[1]) as draws,
floor(split(logsummary, '[/]')[2]) as losses
from table A

2 个答案:

答案 0 :(得分:0)

使用0值而不是1然后你将得到5值

hive> Select floor(split('5/0/3/0/4/4/143504', '[/]')[0]) as draws;
    +--------+--+
    | draws  |
    +--------+--+
    | 5      |
    +--------+--+

下面的语句演示了来自记录

的楼层(0,1,2)的结果
hive> Select floor(split('5/0/3/0/4/4/143504', '[/]')[0]) as draws,floor(split('5/0/3/0/4/4/143504', '[/]')[1]),floor(split('5/0/3/0/4/4/143504', '[/]')[2]) losses;
+--------+------+---------+--+
| draws  | _c1  | losses  |
+--------+------+---------+--+
| 5      | 0    | 3       |
+--------+------+---------+--+

答案 1 :(得分:0)

Hive split()函数有两个参数(string, regex pattern),并根据string拆分regex。拆分将以数组形式返回。

可以通过数组索引访问每个拆分。您需要5,可在索引0处获得。

因此,查询应为:

Select 
floor(split('5/0/3/0/4/4/143504', '[/]')[0]) as draws,
floor(split('5/0/3/0/4/4/143504', '[/]')[1]) as losses;

--Output:
draws   losses
5       0

为了扩展这个例子,这些都是分裂:

Select 
floor(split('5/0/3/0/4/4/143504', '[/]')[0]) as e0,
floor(split('5/0/3/0/4/4/143504', '[/]')[1]) as e1,
floor(split('5/0/3/0/4/4/143504', '[/]')[2]) as e2,
floor(split('5/0/3/0/4/4/143504', '[/]')[3]) as e3,
floor(split('5/0/3/0/4/4/143504', '[/]')[4]) as e4,
floor(split('5/0/3/0/4/4/143504', '[/]')[5]) as e5,
floor(split('5/0/3/0/4/4/143504', '[/]')[6]) as e6;

--Output
e0  e1  e2  e3  e4  e5  e6
5   0   3   0   4   4   143504