在第二个点sql之前获取所有内容
我想在第二个小数点/点之前获取列(列名:test)中的所有内容。该列为字符串格式 示例:列测试中的数据在第二个点sql之前获取所有内容,sql,hive,Sql,Hive,我想在第二个小数点/点之前获取列(列名:test)中的所有内容。该列为字符串格式 示例:列测试中的数据 a bc.de.fg k.l.o.p 期望输出 a bc.de k.l 这项工作: select left((left('a bc.de.fg k.l.o.p' , len('a bc.de.fg k.l.o.p')-charindex('.', reverse('a bc.de.fg k.l.o.p'))) ) , len((left('a bc.de.fg k.l.o.p' ,
a bc.de.fg
k.l.o.p
期望输出
a bc.de
k.l
这项工作:
select
left((left('a bc.de.fg k.l.o.p' , len('a bc.de.fg k.l.o.p')-charindex('.', reverse('a bc.de.fg k.l.o.p'))) )
, len((left('a bc.de.fg k.l.o.p' , len('a bc.de.fg k.l.o.p')-charindex('.', reverse('a bc.de.fg k.l.o.p'))) )
)-charindex('.', reverse((left('a bc.de.fg k.l.o.p' , len('a bc.de.fg k.l.o.p')-charindex('.', reverse('a bc.de.fg k.l.o.p'))) ))))
使用
locate
函数,我们可以在两次迭代中找出第二个“.”的位置。然后使用substr
,我们可以得到从位置1到我们得到的数字的字符串内容
select
substr("a bc.de.fg k.l.o.p"
,1
,locate(
substr("a bc.de.fg k.l.o.p",
locate("a bc.de.fg k.l.o.p" ,".") +1
,1000
)
,"."
) - 1
)
您可以创建基于Java的用户定义函数,并将列作为参数传递
import org.apache.hadoop.hive.ql.exec.UDF;
class UdfClass extends UDF {
public String evaluate(String input) {
String arr[]= input.split(".");
return arr[0]+=arr[1];
}
}
您需要在配置单元中创建一个函数:
add jar /path/to/youJar.jar;
create temporary function new_function_name as 'jar_class_name';
之后,您将能够进行如下查询:
select new_function_name(test) from teble_name
使用
charindex
twiceSee如下,并将“a bc.de.fg k.l.o.p”替换为您的列名。如果这是您经常遇到的问题,您可能需要考虑添加一个函数(用分隔符拆分字段并在特定位置访问子字符串)