【Hive】SQL 数据结构 & 常用函数

2 篇文章 0 订阅


一、数据结构

1、基本数据类型

Hive数据类型Java数据类型长度例子
TINYINTbyte1byte有符号整数20
SMALINTshort2byte有符号整数20
INTint4byte有符号整数20
BIGINTlong8byte有符号整数20
BOOLEANboolean布尔类型,true或者falseTRUE FALSE
FLOATfloat单精度浮点数3.14159
DOUBLEdouble双精度浮点数3.14159
STRINGstring字符系列。可以指定字符集。可以使用单引号或者双引号。‘now is the time’ “for all good men”
TIMESTAMP时间类型
BINARY字节数组

注意: Hive中的String类型相当于数据库的varchar类型,是一个可变的字符串,但是在Hive中不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。


2、集合数据类型

  Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。
  ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。

数据类型描述语法示例
STRUCT和c语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。struct()struct<street:string, city:string>
MAPMAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素map()map<string, int>
ARRAY数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。Array()array<string>

3、类型转化

  Hive的原子数据类型是可以进行隐式转换的,类似于Java的类型转换。
  例如:某表达式使用INT类型,TINYINT会自动转换为INT类型;
  但是Hive不会进行反向转化,例如,某表达式使用TINYINT类型,INT不会自动转换为TINYINT类型,它会返回错误,除非使用CAST操作。

1)隐式类型转换规则如下:
(1)任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。
(2)所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。
(3)TINYINT、SMALLINT、INT都可以转换为FLOAT。
(4)BOOLEAN类型不可以转换为任何其它的类型。
2)可以使用CAST操作显示进行数据类型转换
  例如CAST(‘1’ AS INT)将把字符串’1’ 转换成整数1;如果强制类型转换失败,如执行CAST(‘X’ AS INT),表达式返回空值 NULL。


二、常用函数

1、常用日期函数

1. unix_timestamp: 返回当前或指定时间的时间戳	
select unix_timestamp();
select unix_timestamp("2020-10-28",'yyyy-MM-dd');

2. from_unixtime:将时间戳转为日期格式
select from_unixtime(1603843200);

3. current_date:当前日期
select current_date;

4. current_timestamp:当前的日期加时间
select current_timestamp;

5. to_date:抽取日期部分
select to_date('2020-10-28 12:12:12');

6. year:获取年
select year('2020-10-28 12:12:12');

7. month:获取月
select month('2020-10-28 12:12:12');

8. day:获取日
select day('2020-10-28 12:12:12');

9. hour:获取时
select hour('2020-10-28 12:13:14');

10. minute:获取分
select minute('2020-10-28 12:13:14');

11. second:获取秒
select second('2020-10-28 12:13:14');

12. weekofyear:当前时间是一年中的第几周
select weekofyear('2020-10-28 12:12:12');

13. dayofmonth:当前时间是一个月中的第几天
select dayofmonth('2020-10-28 12:12:12');

14. months_between: 两个日期间的月份
select months_between('2020-04-01','2020-10-28');

15. add_months:日期加减月
select add_months('2020-10-28',-3);

16. datediff:两个日期相差的天数
select datediff('2020-11-04','2020-10-28');

17. date_add:日期加天数
select date_add('2020-10-28',4);

18. date_sub:日期减天数
select date_sub('2020-10-28',-4);

19. last_day:日期的当月的最后一天
select last_day('2020-02-30');

20. date_format(): 格式化日期
select date_format('2020-10-28 12:12:12','yyyy/MM/dd HH:mm:ss');

2、常用取整函数

21. round: 四舍五入
select round(3.14);
select round(3.54);

22. ceil:  向上取整
select ceil(3.14);
select ceil(3.54);

floor: 向下取整
23. select floor(3.14);
select floor(3.54);

3、常用字符串操作函数

24. upper: 转大写
select upper('low');

25. lower: 转小写
select lower('low');

26. length: 长度
select length("atguigu");

27. trim:  前后去空格
select trim(" atguigu ");

28. lpad: 向左补齐,到指定长度
select lpad('atguigu',9,'g');

29. rpad:  向右补齐,到指定长度
select rpad('atguigu',9,'g');

30. regexp_replace:使用正则表达式匹配目标字符串,匹配成功后替换!
SELECT regexp_replace('2020/10/25', '/', '-');

4、集合操作

31. size: 集合中元素的个数
select size(friends) from test3;

32. map_keys: 返回map中的key
select map_keys(children) from test3;

33. map_values: 返回map中的value
select map_values(children) from test3;

34. array_contains: 判断array中是否包含某个元素
select array_contains(friends,'bingbing') from test3;

35. sort_array: 将array中的元素排序
select sort_array(friends) from test3;

5、自定义函数

自定义函数 - Hive官方文档

根据用户自定义函数类别分为以下三种:
(1)UDF(User-Defined-Function): 一进一出;
(2)UDAF(User-Defined Aggregation Function): 聚集函数,多进一出;
类似于:count/max/min
(3)UDTF(User-Defined Table-Generating Functions): 一进多出。
如 lateral view explode()

1、自定义UDF函数

<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
	<version>3.1.2</version>
</dependency>
/**
 * 自定义UDF函数,需要继承GenericUDF类
 * 需求: 计算指定字符串的长度
 */

public class HiveUDF extends GenericUDF {
    /**
     *
     * @param objectInspectors 输入参数类型的鉴别器对象
     * @return 返回值类型的鉴别器对象
     * @throws UDFArgumentException
     */

    @Override
    public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
        // 判断输入参数的个数
        if(objectInspectors.length != 1){
            throw new UDFArgumentLengthException("输入参数长度错误!!!");
        }
        // 判断输入参数的类型
        if(!objectInspectors[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)){
            throw new UDFArgumentTypeException(0, "输入参数类型错误!!!");
        }
        //函数本身返回值为int,需要返回int类型的鉴别器对象
        return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
    }

    /**
     * 函数的逻辑处理
     * @param deferredObjects 输入的参数
     * @return 返回值
     * @throws HiveException
     */
    @Override
    public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
        if(deferredObjects[0].get() == null){
            return 0 ;
        }
        return deferredObjects[0].get().toString().length();
    }

    @Override
    public String getDisplayString(String[] strings) {
        return "计算指定字符串的长度";
    }
}
1、将项目打成jar包上传到服务器/local/datas/myudf.jar
2、将jar包添加到hive的classpath
hive (default)> add jar /local/datas/myudf.jar;
3、创建临时函数与开发好的java class关联
hive (default)> create temporary function myudf as "com.atguigu.hive.MyStringLength";
4、即可在hql中使用自定义的函数 
hive (default)> select myudf(name) as name_len from emp;

2、自定义UDTF

public class MyUDTF extends GenericUDTF {
    private ArrayList<String> outList = new ArrayList<>();

    @Override
    public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
        //1.定义输出数据的列名和类型
        List<String> fieldNames = new ArrayList<>();
        List<ObjectInspector> fieldOIs = new ArrayList<>();
        //2.添加输出数据的列名和类型
        fieldNames.add("lineToWord");
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
    }
    @Override
    public void process(Object[] args) throws HiveException {
        //1.获取原始数据
        String arg = args[0].toString();
        //2.获取数据传入的第二个参数,此处为分隔符
        String splitKey = args[1].toString();
        //3.将原始数据按照传入的分隔符进行切分
        String[] fields = arg.split(splitKey);
        //4.遍历切分后的结果,并写出
        for (String field : fields) {

            //集合为复用的,首先清空集合
            outList.clear();

            //将每一个单词添加至集合
            outList.add(field);

            //将集合内容写出
            forward(outList);
        }
    }
    @Override
    public void close() throws HiveException {}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 你好!我是 ChatGPT,很高兴为您提供帮助。根据您的描述,您问了一个关于Hive SQL的问题,具体是哪些函数可以用于处理JSON数据。以下是对您问题的回答: Hive SQL 支持处理 JSON 数据的函数,这些函数可以解析 JSON 数据并提取其中的值。以下是一些常用函数: - get_json_object:用于从 JSON 字符串中提取指定键的值。 - json_tuple:用于从 JSON 字符串中提取多个键的值,结果以元组的形式返回。 - json_array:用于将多个 JSON 字符串组合成一个 JSON 数组。 - json_object:用于将多个键值对组合成一个 JSON 对象。 您可以在 Hive SQL 的官方文档中查找更多关于 JSON 数据处理函数的信息。 希望这些信息可以帮助您解决问题,如果您有任何其他问题或需要更多帮助,请随时问我! ### 回答2: 在Hive SQL中,有一些常用函数用于处理JSON数据,包括: 1. get_json_object:用于从JSON字符串中获取指定字段的值。可以使用该函数获取嵌套结构中的字段值,例如get_json_object(json_data, '$.name')。 2. json_tuple:用于从JSON字符串中提取多个字段的值。使用该函数可以同时获取多个字段的值,并且可以指定字段的别名,例如json_tuple(json_data, 'name', 'age') AS (name, age)。 3. json_extract:用于从JSON对象中提取出满足条件的成员。使用该函数可以提取出符合某个条件的JSON成员,例如json_extract(json_data, '$.persons[0]')。 4. json_array_contains:用于判断一个JSON数组中是否包含指定值。使用该函数可以判断一个JSON数组中是否包含某个特定的值,例如json_array_contains(json_data, 100)。 5. json_array_size:用于获取JSON数组的长度。使用该函数可以获取JSON数组中元素的个数,例如json_array_size(json_data)。 6. json_map:用于将多个键值对转换为JSON对象。使用该函数可以将多个键值对转换为一个JSON对象,例如json_map('name', 'John', 'age', 25)。 7. json_object:用于将多个键值对转换为JSON对象。该函数与json_map类似,也可以将多个键值对转换为一个JSON对象,例如json_object('name', 'John', 'age', 25)。 这些函数可以在Hive SQL中用于处理JSON数据,使得我们可以方便地处理包含JSON格式的数据。 ### 回答3: 在Hive SQL中,有一些常用函数用于处理JSON数据,包括以下几个: 1. get_json_object:用于获取JSON对象中的字段值。通过指定JSON路径,可以获取JSON对象中指定字段的值。 2. json_tuple:用于解析JSON对象并返回字段值的元组。可以将JSON对象作为参数传递给该函数,然后按照字段顺序获取对应的字段值。 3. json_array_contains:用于检查JSON数组中是否包含指定的值。通过指定JSON数组和要检查的值,可以判断该值是否存在于JSON数组中。 4. json_size:用于获取JSON数组或对象的大小。可以返回JSON数组中元素的个数,或者返回JSON对象中字段的个数。 5. json_tuple_count:用于获取JSON元组中字段的个数。可以返回JSON元组中字段的数量。 6. lateral view json_tuple:用于解析含有嵌套结构的JSON数据。通过指定JSON路径和字段列表,可以解析出指定字段的值,包括嵌套的字段。 这些函数可以帮助我们在Hive SQL中处理JSON数据,提取所需的字段值、检查包含关系以及获取JSON对象的大小等操作。通过灵活运用这些函数,我们可以更方便地处理JSON格式的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值