• hive操作


    Hive

    启动类

    功能说明命令
    启动hiveserver2服务bin/hiveserver2
    启动beelinebin/beeline
    连接hiveserver2beeline> !connect jdbc:hive2://hadoop102:10000
    metastroe服务bin/hive --service metastore

    hive 启动元数据服务(metastore和hiveserver2)和优雅关闭脚本

    1. 启动: hive.sh start
    2. 关闭: hive.sh stop
    3. 重启: hive.sh restart
    4. 状态: hive.sh status

    脚本如下

    1. #!/bin/bash
    2. HIVE_LOG_DIR=$HIVE_HOME/logs
    3. mkdir -p $HIVE_LOG_DIR
    4. #检查进程是否运行正常,参数1为进程名,参数2为进程端口
    5. function check_process()
    6. {
    7. pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
    8. ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
    9. echo $pid
    10. [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
    11. }
    12. function hive_start()
    13. {
    14. metapid=$(check_process HiveMetastore 9083)
    15. cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
    16. cmd=$cmd" sleep4; hdfs dfsadmin -safemode wait >/dev/null 2>&1"
    17. [ -z "$metapid" ] && eval $cmd || echo "Metastroe服务已启动"
    18. server2pid=$(check_process HiveServer2 10000)
    19. cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"
    20. [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服务已启动"
    21. }
    22. function hive_stop()
    23. {
    24. metapid=$(check_process HiveMetastore 9083)
    25. [ "$metapid" ] && kill $metapid || echo "Metastore服务未启动"
    26. server2pid=$(check_process HiveServer2 10000)
    27. [ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动"
    28. }
    29. case $1 in
    30. "start")
    31. hive_start
    32. ;;
    33. "stop")
    34. hive_stop
    35. ;;
    36. "restart")
    37. hive_stop
    38. sleep 2
    39. hive_start
    40. ;;
    41. "status")
    42. check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"
    43. check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服务运行正常" || echo "HiveServer2服务运行异常"
    44. ;;
    45. *)
    46. echo Invalid Args!
    47. echo 'Usage: '$(basename $0)' start|stop|restart|status'
    48. ;;
    49. esac

    常用交互命令

    功能说明命令
    不进入hive的交互窗口执行sqlbin/hive -e “sql语句”
    执行脚本中sql语句bin/hive -f hive.sql
    退出hive窗口exit 或 quit
    命令窗口中查看hdfs文件系统dfs -ls /
    命令窗口中查看hdfs文件系统! ls /data/h

    SQL类(特殊的)

    说明语句
    查看hive中的所有数据库show databases
    用default数据库use default
    查询表结构desc table_name
    查看数据库show databases
    重命名表名alter table table1 rename to table2
    修改表中字段alter table table_name change name user_name String
    修改字段类型alter table table_name change salary salary Double
    创建外部表create external table …
    查询外部表信息desc formatted outsidetable
    创建视图create view view_name as select * from table_name …
    添加数据load data local inpath ‘xxx’ overwrite into table table_name partition(day=‘2021-12-01’)

    内置函数

    (1) NVL

    给值为NULL的数据赋值,它的格式是NVL( value,default_value)。它的功能是如果value为NULL,则NVL函数返回default_value的值,否则返回value的值,如果两个参数都为NULL ,则返回NULL

    select nvl(column, 0) from xxx;
    

    (2)行转列

    函数描述
    CONCAT(string A/col, string B/col…)返回输入字符串连接后的结果,支持任意个输入字符串
    CONCAT_WS(separator, str1, str2,…)第一个参数参数间的分隔符,如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间。
    COLLECT_SET(col)将某字段的值进行去重汇总,产生array类型字段
    COLLECT_LIST(col)函数只接受基本数据类型,它的主要作用是将某字段的值进行不去重汇总,产生array类型字段。

    (3)列转行(一列转多行)

    Split(str, separator): 将字符串按照后面的分隔符切割,转换成字符array。

    EXPLODE(col):
    将hive一列中复杂的array或者map结构拆分成多行。

    LATERAL VIEW

    1. 用法:
    2. LATERAL VIEW udtf(expression) tableAlias AS columnAlias

    解释:lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

    lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。

    准备数据源测试

    moviecategory
    《功勋》记录,剧情
    《战狼2》战争,动作,灾难

    SQL

    1. SELECT movie,category_name
    2. FROM movie_info
    3. lateral VIEW
    4. explode(split(category,",")) movie_info_tmp AS category_name ;

    测试结果

    1. 《功勋》 记录
    2. 《功勋》 剧情
    3. 《战狼2》 战争
    4. 《战狼2》 动作
    5. 《战狼2》 灾难

    窗口函数

    (1)OVER()

    定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。

    (2)CURRENT ROW(当前行)

    1. n PRECEDING:往前n行数据
    2. n FOLLOWING:往后n行数据

    (3)UNBOUNDED(无边界)

    1. UNBOUNDED PRECEDING 前无边界,表示从前面的起点
    2. UNBOUNDED FOLLOWING后无边界,表示到后面的终点

    SQL案例:由起点到当前行的聚合

    1. select
    2. sum(money) over(partition by user_id order by pay_time rows between UNBOUNDED PRECEDING and current row)
    3. from or_order;

    SQL案例:当前行和前面一行做聚合

    1. select
    2. sum(money) over(partition by user_id order by pay_time rows between 1 PRECEDING and current row)
    3. from or_order;

    SQL案例:当前行和前面一行和后一行做聚合

    1. select
    2. sum(money) over(partition by user_id order by pay_time rows between 1 PRECEDING AND 1 FOLLOWING )
    3. from or_order;

    SQL案例:当前行及后面所有行

    1. select
    2. sum(money) over(partition by user_id order by pay_time rows between current row and UNBOUNDED FOLLOWING )
    3. from or_order;

    (4)LAG(col,n,default_val)

    往前第n行数据,没有的话default_val

    (5)LEAD(col,n, default_val)

    往后第n行数据,没有的话default_val

    SQL案例:查询用户购买明细以及上次的购买时间和下次购买时间

    1. select
    2. user_id,,pay_time,money,
    3. lag(pay_time,1,'1970-01-01') over(PARTITION by name order by pay_time) prev_time,
    4. lead(pay_time,1,'1970-01-01') over(PARTITION by name order by pay_time) next_time
    5. from or_order;

    (6)FIRST_VALUE(col,true/false)

    当前窗口下的第一个值,第二个参数为true,跳过空值。

    (7)LAST_VALUE (col,true/false)

    当前窗口下的最后一个值,第二个参数为true,跳过空值。

    SQL案例:查询用户每个月第一次的购买时间 和 每个月的最后一次购买时间

    1. select
    2. FIRST_VALUE(pay_time)
    3. over(
    4. partition by user_id,month(pay_time) order by pay_time
    5. rows between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING
    6. ) first_time,
    7. LAST_VALUE(pay_time)
    8. over(partition by user_id,month(pay_time) order by pay_time rows between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING
    9. ) last_time
    10. from or_order;

    (8)NTILE(n)

    把有序窗口的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。(用于将分组数据按照顺序切分成n片,返回当前切片值)

    SQL案例:查询前25%时间的订单信息

    1. select * from (
    2. select User_id,pay_time,money,
    3. ntile(4) over(order by pay_time) sorted
    4. from or_order
    5. ) t
    6. where sorted = 1;

    4个By

    (1)Order By

    全局排序,只有一个Reducer。

    (2)Sort By

    分区内有序。

    (3)Distrbute By

    类似MR中Partition,进行分区,结合sort by使用。

    (4) Cluster By

    当Distribute by和Sorts by字段相同时,可以使用Cluster by方式。Cluster by除了具有Distribute by的功能外还兼具Sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

    在生产环境中Order By用的比较少,容易导致OOM。

    在生产环境中Sort By+ Distrbute By用的多。

    排序函数

    (1)RANK()

    排序相同时会重复,总数不会变

    1. 1
    2. 1
    3. 3
    4. 3
    5. 5

    (2)DENSE_RANK()

    排序相同时会重复,总数会减少

    1. 1
    2. 1
    3. 2
    4. 2
    5. 3

    (3)ROW_NUMBER()

    会根据顺序计算

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5

    日期函数

    datediff:返回结束日期减去开始日期的天数

    1. datediff(string enddate, string startdate)
    2. select datediff('2021-11-20','2021-11-22')

    date_add:返回开始日期startdate增加days天后的日期

    1. date_add(string startdate, int days)
    2. select date_add('2021-11-20',3)

    date_sub:返回开始日期startdate减少days天后的日期

    1. date_sub (string startdate, int days)
    2. select date_sub('2021-11-22',3)
  • 相关阅读:
    RabbitMq学习笔记
    springnative让java应用脱离jvm
    【毕业设计】基于java+SSH+jsp的物资租赁系统设计与实现(毕业论文+程序源码)——物资租赁系统
    哪里有写毕业论文需要的外文文献?
    从此再也不用怕崩溃闪退了
    代挂单页网址发布页+加盟代理+APP下载页源码
    圣经投屏Java+sqlite3极速版
    基于javaweb的在线美食网站系统(java+ssm+jsp+mysql)
    【数据结构练习】栈的面试题集锦
    鲲鹏920(ARM64)移植javacpp
  • 原文地址:https://blog.csdn.net/m0_60600640/article/details/132901573