0


Hive-SQL语法大全

Hive SQL 语法大全

基于语法描述说明

CREATEDATABASE[IFNOTEXISTS] db_name [LOCATION]'path';SELECT expr,...FROM tbl ORDERBY col_name [ASC|DESC](A | B | C)

如上语法,在语法描述中出现:

  • [],表示可选,如上[LOCATION] 表示可写、可不写
  • |,表示或,如上ASC | DESC,表示二选一
  • …,表示序列,即未完结,如上SELECT expr, ... 表示在SELECT后可以跟多个expr(查询表达式),以逗号隔开
  • (),表示必填,如上(A | B | C)表示此处必填,填入内容在A、B、C中三选一

数据库操作

创建数据库

CREATEDATABASE[IFNOTEXISTS] db_name [LOCATION 'path'][COMMENT database_comment];
  • IF NOT EXISTS,如存在同名数据库不执行任何操作,否则执行创建数据库操作
  • [LOCATION],自定义数据库存储位置,如不填写,默认数据库在HDFS的路径为:/user/hive/warehouse
  • [COMMENT database_comment],可选,数据库注释

删除数据库

DROPDATABASE[IFEXISTS] db_name [CASCADE];
  • [IF EXISTS],可选,如果存在此数据库执行删除,不存在不执行任何操作
  • [CASCADE],可选,级联删除,即数据库内存在表,使用CASCADE可以强制删除数据库

数据库修改LOCATION

ALTERDATABASE database_name SET LOCATION hdfs_path;

不会在HDFS对数据库所在目录进行改名,只是修改location后,新创建的表在新的路径,旧的不变

选择数据库

USE db_name;
  • 选择数据库后,后续SQL操作基于当前选择的库执行
  • 如不使用use,默认在default库执行

若想切换回使用default库

USEDEFAULT;

查询当前USE的数据库

SELECT current_database();

表操作

数据类型

分类类型描述****字面量示例原始类型BOOLEANtrue/falseTRUETINYINT1字节的有符号整数 -1281271YSMALLINT2个字节的有符号整数,-32768327671SINT4个字节的带符号整数1BIGINT8字节带符号整数1LFLOAT4字节单精度浮点数1.0DOUBLE8字节双精度浮点数1.0DEICIMAL任意精度的带符号小数1.0STRING字符串,变长“a”,’b’VARCHAR变长字符串“a”,’b’CHAR固定长度字符串“a”,’b’BINARY字节数组TIMESTAMP时间戳,毫秒值精度122327493795DATE日期‘2016-03-29’时间频率间隔复杂类型ARRAY有序的的同类型的集合array(1,2)MAPkey-value,key必须为原始类型,value可以任意类型map(‘a’,1,’b’,2)STRUCT字段集合,类型可以不同struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0)UNION在有限取值范围内的一个值create_union(1,’a’,63)

基础建表

CREATE[EXTERNAL]TABLE tb_name
    (col_name col_type [COMMENT col_comment],......)[COMMENT tb_comment][PARTITIONED BY(col_name, col_type,......)][CLUSTEREDBY(col_name, col_type,......)INTO num BUCKETS][ROW FORMAT DELIMITED FIELDSTERMINATEDBY''][LOCATION 'path']
  • [EXTERNAL],外部表,必须搭配
  • [ROW FORMAT DELIMITED FIELDS TERMINATED BY '']指定列分隔符
  • [LOCATION 'path']表数据路径
  • 外部表示意CREATE EXTERNAL TABLE test_ext(id int)COMMENT'external table'ROW FORMAT DELIMITED FIELDSTERMINATEDBY'\t' LOCATION 'hdfs://node1:8020/tmp/test_ext';

(1)外部表中的表和数据是相互独立的,将表删除(删除元数据),数据还保留在Hive中;将数据删除,表仍然存在。
请添加图片描述

(2) 删除内部表,则元数据和数据都被删除。
请添加图片描述

  • [desc formatted tablename]查看表类型
  • [COMMENT tb_comment]表注释,可选
  • [PARTITIONED BY(col_name, col_type, ......)]基于列分区-- 分区表示意CREATETABLE test_ext(id int)COMMENT'partitioned table'PARTITIONBY(year string,month string,day string)ROW FORMAT DELIMITED FIELDSTERMINATEDBY'\t';
  • [CLUSTERED BY(col_name, col_type, ......)]基于列分桶CREATETABLE course (c_id string,c_name string,t_id string)CLUSTEREDBY(c_id)INTO3 BUCKETS ROW FORMAT DELIMITED FIELDSTERMINATEDBY'\t';

基于其它表的结构建表

CREATETABLE tbl_name LIKE other_tbl;

基于查询结果建表

CREATETABLE tbl_name ASSELECT...;

删除表

DROPTABLE tbl;

修改表

重命名

ALTERTABLE old RENAMETO new;

修改属性:内部表和外部表的转换

ALTERTABLE tbl SET TBLPROPERTIES(key=value);-- 常用属性("EXTERNAL"="TRUE")-- 内外部表,TRUE表示外部表,内转外('comment'= new_comment)-- 修改表注释-- 其余属性参见
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-listTableProperties

分区操作

创建分区表: 将表拆分到不同的子文件夹中进行存储

-- 分区表示意CREATETABLE test_ext(id int)COMMENT'partitioned table'PARTITIONBY(year string,month string,day string)ROW FORMAT DELIMITED FIELDSTERMINATEDBY'\t';

添加分区

ALTERTABLE tablename ADDPARTITION(partition_key='partition_value',......);

修改分区值

ALTERTABLE tablename PARTITION(partition_key='old_partition_value')RENAMETOPARTITION(partition_key='new_partition_value');

注意

只会在元数据中修改,不会同步修改HDFS路径吗,如:

  • 原分区路径为:/user/hive/warehouse/test.db/test_table/month=201910,分区名:month='201910'
  • 将分区名修改为:201911后,分区所在路径不变,依旧是:/user/hive/warehouse/test.db/test_table/month=201910

如果希望修改分区名后,同步修改HDFS的路径,并保证正常可用,需要:

  • 在元数据库中:找到SDS表 -> 找到LOCATION列 -> 找到对应分区的路径记录进行修改- 如将记录的:/user/hive/warehouse/test.db/test_table/month=201910 修改为:/user/hive/warehouse/test.db/test_table/month=201911
  • 在HDFS中,同步修改文件夹名 - 如将文件夹:/user/hive/warehouse/test.db/test_table/month=201910 修改为:/user/hive/warehouse/test.db/test_table/month=201911

删除分区

ALTERTABLE tablename DROPPARTITION(partition_key='partition_value');

删除分区后,只是在元数据中删除,即删除元数据库中:

  • PARTITION
  • SDS

相关记录

分区所在的HDFS文件夹依旧保留

加载数据

LOAD DATA:从本地 or Hdfs

LOADDATA[LOCAL] INPATH 'path'INTOTABLE tbl PARTITION(partition_key='partition_value');-- 注意,基于HDFS进行load加载数据,源数据文件会消失--(本质是被移动到表所在的目录中)

INSERT SELECT:从其他表中加载数据

INSERT(OVERWRITE |INTO)TABLE tbl PARTITION(partition_key='partition_value')SELECT...FROM...;

分桶操作

分桶是将表拆分到固定数量的不同文件中进行存储

建表

set hive.enforce.bucketing=true;--开启分桶自动优化-- 创建分桶表CREATETABLE course (c_id string,c_name string,t_id string)[PARTITION(partition_key='partition_value')]CLUSTEREDBY(c_id)INTO3 BUCKETS 
    ROW FORMAT DELIMITED FIELDSTERMINATEDBY'\t';
  • CLUSTERED BY(col) 指定分桶列
  • INTO 3 BUCKETS,设定3个桶

分桶表需要开启:

set hive.enforce.bucketing=true;

设置自动匹配桶数量的reduces task数量

分桶表能带来什么性能提升?
答:在基于分桶列做操作的前提下,单值过滤、Group by、join。

数据加载

INSERT(OVERWRITE |INTO)TABLE tbl 
    [PARTITION(partition_key='partition_value')]SELECT...FROM... CLUSTER BY(col);

分桶表无法使用LOAD DATA进行数据加载

数据加载

LOAD DATA

将数据文件加载到表

LOADDATA[LOCAL] INPATH 'path'INTOTABLE tbl [PARTITION(partition_key='partition_value')];-- 指定分区可选

INSERT SELECT

将其它表数据,加载到目标表

INSERT(OVERWRITE |INTO)TABLE tbl 
    [PARTITION(partition_key='partition_value')]-- 指定分区,可选SELECT...FROM...[CLUSTER BY(col)];-- 指定分桶列,可选

数据导出

INSERT OVERWRITE SELECT

INSERT OVERWRITE [LOCAL] DIRECTORY ‘path’                 -- LOCAL可选,带LOCAL导出Linux本地,不带LOCAL导出到HDFS[ROW FORMAT DELIMITED FIELDSTERMINATEDBY'']-- 可选,自定义列分隔符SELECT...FROM...;-- 将表中的数据导出到其他任意目录,例如linux本地磁盘,例如hdfs,例如mysql等等

bin/hive

  • bin/hive -e 'sql' > export_filesql结果重定向到导出文件中
  • bin/hive -f 'sql_script_file' > export_filesql脚本执行的结果重定向到导出文件中

复杂类型

类型定义示例内含元素类型元素个数取元素可用函数arrayarray<类型>如定义为array数据为:1,2,3,4,5单值,类型取决于定义动态,不限制array[数字序号] 序号从0开始size统计元素个数 array_contains判断是否包含指定数据mapmap<key类型, value类型>如定义为:map<string, int>数据为:{’a’: 1, ‘b’: 2, ‘c’: 3}键值对,K-V,K和V类型取决于定义动态,不限制map[key] 取出对应key的valuesize统计元素个数array_contains判断是否包含指定数据 map_keys取出全部key,返回array map_values取出全部values,返回arraystructstruct<子列名 类型, 子列名 类型…>如定义为:struct<c1 string, c2 int, c3 date>数据为:’a’, 1, ‘2000-01-01’单值,类型取决于定义固定,取决于定义的子列数量struct.子列名 通过子列名取出子列值暂无

数据查询的课堂SQL记录

基本查询

createdatabase itheima;use itheima;CREATETABLE itheima.orders (
    orderId bigintCOMMENT'订单id',
    orderNo string COMMENT'订单编号',
    shopId bigintCOMMENT'门店id',
    userId bigintCOMMENT'用户id',
    orderStatus tinyintCOMMENT'订单状态 -3:用户拒收 -2:未付款的订单 -1:用户取消 0:待发货 1:配送中 2:用户确认收货',
    goodsMoney doubleCOMMENT'商品金额',
    deliverMoney doubleCOMMENT'运费',
    totalMoney doubleCOMMENT'订单金额(包括运费)',
    realTotalMoney doubleCOMMENT'实际订单金额(折扣后金额)',
    payType tinyintCOMMENT'支付方式,0:未知;1:支付宝,2:微信;3、现金;4、其他',
    isPay tinyintCOMMENT'是否支付 0:未支付 1:已支付',
    userName string COMMENT'收件人姓名',
    userAddress string COMMENT'收件人地址',
    userPhone string COMMENT'收件人电话',
    createTime timestampCOMMENT'下单时间',
    payTime timestampCOMMENT'支付时间',
    totalPayFee intCOMMENT'总支付金额')ROW FORMAT DELIMITED FIELDSTERMINATEDBY'\t';loaddatalocal inpath '/home/hadoop/itheima_orders.txt'intotable itheima.orders;CREATETABLE itheima.users (
    userId int,
    loginName string,
    loginSecret int,
    loginPwd string,
    userSex tinyint,
    userName string,
    trueName string,
    brithday date,
    userPhoto string,
    userQQ string,
    userPhone string,
    userScore int,
    userTotalScore int,
    userFrom tinyint,
    userMoney double,
    lockMoney double,
    createTime timestamp,
    payPwd string,
    rechargeMoney double)ROW FORMAT DELIMITED FIELDSTERMINATEDBY'\t';loaddatalocal inpath '/home/hadoop/itheima_users.txt'intotable itheima.users;-- 查询全表数据SELECT*FROM itheima.orders;-- 查询单列信息SELECT orderid, userid, totalmoney FROM itheima.orders o ;-- 查询表有多少条数据SELECTCOUNT(*)FROM itheima.orders;-- 过滤广东省的订单SELECT*FROM itheima.orders WHERE useraddress LIKE'%广东%';-- 找出广东省单笔营业额最大的订单SELECT*FROM itheima.orders WHERE useraddress LIKE'%广东%'ORDERBY totalmoney DESCLIMIT1;-- 统计未支付、已支付各自的人数SELECT ispay,COUNT(*)FROM itheima.orders o GROUPBY ispay ;-- 在已付款的订单中,统计每个用户最高的一笔消费金额SELECT userid,MAX(totalmoney)FROM itheima.orders WHERE ispay =1GROUPBY userid;-- 统计每个用户的平均订单消费额SELECT userid,AVG(totalmoney)FROM itheima.orders GROUPBY userid;-- 统计每个用户的平均订单消费额,并过滤大于10000的数据SELECT userid,AVG(totalmoney)AS avg_money FROM itheima.orders GROUPBY userid HAVING avg_money >10000;-- 订单表和用户表JOIN 找出用户usernameSELECT o.orderid, o.userid, u.username FROM itheima.orders o JOIN itheima.users u ON o.userid = u.userid;SELECT o.orderid, o.userid, u.username FROM itheima.orders o LEFTJOIN itheima.users u ON o.userid = u.userid;

RLIKE

image-20230224234706719

image-20230224234719463

image-20230224234733895

-- 查找广东省数据SELECT*FROM itheima.orders WHERE useraddress RLIKE'.*广东.*';-- 查找用户地址是:xx省 xx市 xx区SELECT*FROM itheima.orders WHERE useraddress RLIKE'..省 ..市 ..区';-- 查找用户姓为:张、王、邓SELECT*FROM itheima.orders WHERE username RLIKE'[张王邓]\\S+';-- 查找手机号符合:188****0*** 规则SELECT*FROM itheima.orders WHERE userphone RLIKE'188\\S{4}0[0-9]{3}';

UNION联合

CREATETABLE itheima.course(
c_id string, 
c_name string, 
t_id string)ROW FORMAT DELIMITED FIELDSTERMINATEDBY'\t';LOADDATALOCAL INPATH '/home/hadoop/course.txt'INTOTABLE itheima.course;-- 基础UNIONSELECT*FROM itheima.course WHERE t_id ='周杰轮'UNIONSELECT*FROM itheima.course WHERE t_id ='王力鸿';-- 去重演示SELECT*FROM itheima.course
    UNIONSELECT*FROM itheima.course;-- 不去重SELECT*FROM itheima.course
    UNIONALLSELECT*FROM itheima.course;-- UNION写在FROM中 UNION写在子查询中SELECT t_id,COUNT(*)FROM(SELECT*FROM itheima.course WHERE t_id ='周杰轮'UNIONALLSELECT*FROM itheima.course WHERE t_id ='王力鸿')AS u GROUPBY t_id;-- 用于INSERT SELECTINSERT OVERWRITE TABLE itheima.course2
SELECT*FROM itheima.course 
    UNIONSELECT*FROM itheima.course;

Sampling采样

# 随机桶抽取, 分配桶是有规则的# 可以按照列的hash取模分桶# 按照完全随机分桶-- 其它条件不变的话,每一次运行结果一致select username, orderId, totalmoney FROM itheima.orders 
    tablesample(bucket 3outof10on username);-- 完全随机,每一次运行结果不同select*from itheima.orders 
    tablesample(bucket 3outof10on rand());# 数据块抽取,按顺序抽取,每次条件不变,抽取结果不变-- 抽取100条select*from itheima.orders
    tablesample(100rows);-- 取1%数据select*from itheima.orders
    tablesample(1percent);-- 取 1KB数据select*from itheima.orders
    tablesample(1K);

虚拟列

虚拟列是Hive内置的可以在查询语句中使用的特殊标记,可以查询数据本身的详细参数。

Hive目前可用3个虚拟列:

- INPUT__FILE__NAME,显示数据行所在的具体文件
- BLOCK__OFFSET__INSIDE__FILE,显示数据行所在文件的偏移量
- ROW__OFFSET__INSIDE__BLOCK,显示数据所在HDFS块的偏移量
  此虚拟列需要设置:SET hive.exec.rowoffset=true 才可使用
SET hive.exec.rowoffset=true;SELECT orderid, username, INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE, ROW__OFFSET__INSIDE__BLOCK FROM itheima.orders;SELECT*, BLOCK__OFFSET__INSIDE__FILE FROM itheima.orders WHERE BLOCK__OFFSET__INSIDE__FILE <1000;SELECT orderid, username, INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE, ROW__OFFSET__INSIDE__BLOCK FROM itheima.orders_bucket;SELECT INPUT__FILE__NAME,COUNT(*)FROM itheima.orders_bucket GROUPBY INPUT__FILE__NAME;

函数

数值、集合、转换、日期函数

-- 查看所有可用函数show functions;-- 查看函数使用方式describefunctionextended count;-- 数值函数-- round 取整,设置小数精度selectround(3.1415926);-- 取整(四舍五入)selectround(3.1415926,4);-- 设置小数精度4位(四舍五入)-- 随机数select rand();-- 完全随机select rand(3);-- 设置随机数种子,设置种子后每次运行结果一致的-- 绝对值select abs(-3);-- 求PIselect pi();-- 集合函数-- 求元素个数select size(work_locations)from test_array;select size(members)from test_map;-- 取出map的全部keyselect map_keys(members)from test_map;-- 取出map的全部valueselect map_values(members)from test_map;-- 查询array内是否包含指定元素,是就返回Trueselect*from test_array where ARRAY_CONTAINS(work_locations,'tianjin');-- 排序select*, sort_array(work_locations)from test_array;-- 类型转换函数-- 转二进制selectbinary('hadoop');-- 自由转换,类型转换失败报错或返回NULLselect cast('1'asbigint);-- 日期函数-- 当前时间戳selectcurrent_timestamp();-- 当前日期selectcurrent_date();-- 时间戳转日期select to_date(current_timestamp());-- 年月日季度等selectyear('2020-01-11');selectmonth('2020-01-11');selectday('2020-01-11');select quarter('2020-05-11');select dayofmonth('2020-05-11');selecthour('2020-05-11 10:36:59');selectminute('2020-05-11 10:36:59');selectsecond('2020-05-11 10:36:59');select weekofyear('2020-05-11 10:36:59');-- 日期之间的天数select datediff('2022-12-31','2019-12-31');-- 日期相加、相减select date_add('2022-12-31',5);select date_sub('2022-12-31',5);

社交案例操作SQL

准备数据

-- 创建数据库createdatabase db_msg;-- 选择数据库use db_msg;-- 如果表已存在就删除droptableifexists db_msg.tb_msg_source ;-- 建表createtable db_msg.tb_msg_source(
    msg_time string comment"消息发送时间",
    sender_name string comment"发送人昵称",
    sender_account string comment"发送人账号",
    sender_sex string comment"发送人性别",
    sender_ip string comment"发送人ip地址",
    sender_os string comment"发送人操作系统",
    sender_phonetype string comment"发送人手机型号",
    sender_network string comment"发送人网络类型",
    sender_gps string comment"发送人的GPS定位",
    receiver_name string comment"接收人昵称",
    receiver_ip string comment"接收人IP",
    receiver_account string comment"接收人账号",
    receiver_os string comment"接收人操作系统",
    receiver_phonetype string comment"接收人手机型号",
    receiver_network string comment"接收人网络类型",
    receiver_gps string comment"接收人的GPS定位",
    receiver_sex string comment"接收人性别",
    msg_type string comment"消息类型",
    distance string comment"双方距离",
    message string comment"消息内容");-- 上传数据到HDFS(Linux命令)
hadoop fs -mkdir -p /chatdemo/data
hadoop fs -put chat_data-30W.csv /chatdemo/data/-- 加载数据到表中,基于HDFS加载loaddata inpath '/chatdemo/data/chat_data-30W.csv'intotable tb_msg_source;-- 验证数据加载select*from tb_msg_source tablesample(100rows);-- 验证一下表的数量selectcount(*)from tb_msg_source;

ETL清洗转换

createtable db_msg.tb_msg_etl(
    msg_time string comment"消息发送时间",
    sender_name string comment"发送人昵称",
    sender_account string comment"发送人账号",
    sender_sex string comment"发送人性别",
    sender_ip string comment"发送人ip地址",
    sender_os string comment"发送人操作系统",
    sender_phonetype string comment"发送人手机型号",
    sender_network string comment"发送人网络类型",
    sender_gps string comment"发送人的GPS定位",
    receiver_name string comment"接收人昵称",
    receiver_ip string comment"接收人IP",
    receiver_account string comment"接收人账号",
    receiver_os string comment"接收人操作系统",
    receiver_phonetype string comment"接收人手机型号",
    receiver_network string comment"接收人网络类型",
    receiver_gps string comment"接收人的GPS定位",
    receiver_sex string comment"接收人性别",
    msg_type string comment"消息类型",
    distance string comment"双方距离",
    message string comment"消息内容",
    msg_day string comment"消息日",
    msg_hour string comment"消息小时",
    sender_lng doublecomment"经度",
    sender_lat doublecomment"纬度");INSERT OVERWRITE TABLE db_msg.tb_msg_etl
SELECT*,DATE(msg_time)AS msg_day,HOUR(msg_time)AS msg_hour, 
    SPLIT(sender_gps,',')[0]AS sender_lng, 
    SPLIT(sender_gps,',')[1]AS sender_lat
FROM db_msg.tb_msg_source
WHERE LENGTH(sender_gps)>0;

指标计算

需求1

--保存结果表CREATETABLEIFNOTEXISTS tb_rs_total_msg_cnt 
COMMENT"每日消息总量"ASSELECT 
    msg_day,COUNT(*)AS total_msg_cnt 
FROM db_msg.tb_msg_etl 
GROUPBY msg_day;

需求2

--保存结果表CREATETABLEIFNOTEXISTS tb_rs_hour_msg_cnt 
COMMENT"每小时消息量趋势"ASSELECT  
    msg_hour,COUNT(*)AS total_msg_cnt,COUNT(DISTINCT sender_account)AS sender_user_cnt,COUNT(DISTINCT receiver_account)AS receiver_user_cnt
FROM db_msg.tb_msg_etl GROUPBY msg_hour;

需求3

CREATETABLEIFNOTEXISTS tb_rs_loc_cnt
COMMENT'今日各地区发送消息总量'ASSELECT 
    msg_day,  
    sender_lng, 
    sender_lat,COUNT(*)AS total_msg_cnt 
FROM db_msg.tb_msg_etl
GROUPBY msg_day, sender_lng, sender_lat;

需求4

--保存结果表CREATETABLEIFNOTEXISTS tb_rs_user_cnt
COMMENT"今日发送消息人数、接受消息人数"ASSELECT 
msg_day,COUNT(DISTINCT sender_account)AS sender_user_cnt,COUNT(DISTINCT receiver_account)AS receiver_user_cnt
FROM db_msg.tb_msg_etl
GROUPBY msg_day;

需求5

--保存结果表CREATETABLEIFNOTEXISTS db_msg.tb_rs_s_user_top10
COMMENT"发送消息条数最多的Top10用户"ASSELECT 
    sender_name AS username,COUNT(*)AS sender_msg_cnt 
FROM db_msg.tb_msg_etl 
GROUPBY sender_name 
ORDERBY sender_msg_cnt DESCLIMIT10;

需求6

CREATETABLEIFNOTEXISTS db_msg.tb_rs_r_user_top10
COMMENT"接收消息条数最多的Top10用户"ASSELECT 
receiver_name AS username,COUNT(*)AS receiver_msg_cnt 
FROM db_msg.tb_msg_etl 
GROUPBY receiver_name 
ORDERBY receiver_msg_cnt DESCLIMIT10;

需求7

CREATETABLEIFNOTEXISTS db_msg.tb_rs_sender_phone
COMMENT"发送人的手机型号分布"ASSELECT 
    sender_phonetype,COUNT(sender_account)AS cnt 
FROM db_msg.tb_msg_etl 
GROUPBY sender_phonetype;

需求8

--保存结果表CREATETABLEIFNOTEXISTS db_msg.tb_rs_sender_os
COMMENT"发送人的OS分布"ASSELECT
    sender_os,COUNT(sender_account)AS cnt 
FROM db_msg.tb_msg_etl 
GROUPBY sender_os

Hive列注释、表注释等乱码解决方案

-- 在Hive的MySQL元数据库中执行use hive;1).修改字段注释字符集

altertable COLUMNS_V2 modifycolumnCOMMENTvarchar(256)characterset utf8;2).修改表注释字符集

altertable TABLE_PARAMS modifycolumn PARAM_VALUE varchar(4000)characterset utf8;3).修改分区表参数,以支持分区键能够用中文表示

altertable PARTITION_PARAMS modifycolumn PARAM_VALUE varchar(4000)characterset utf8;altertable PARTITION_KEYS modifycolumn PKEY_COMMENT varchar(4000)characterset utf8;4).修改索引注解

mysql>altertable INDEX_PARAMS modifycolumn PARAM_VALUE varchar(4000)characterset utf8;

COUNT(sender_account) AS cnt
FROM db_msg.tb_msg_etl
GROUP BY sender_phonetype;


需求8

```sql
--保存结果表
CREATE TABLE IF NOT EXISTS db_msg.tb_rs_sender_os
COMMENT "发送人的OS分布" AS
SELECT
    sender_os, 
    COUNT(sender_account) AS cnt 
FROM db_msg.tb_msg_etl 
GROUP BY sender_os

Hive列注释、表注释等乱码解决方案

-- 在Hive的MySQL元数据库中执行use hive;1).修改字段注释字符集

altertable COLUMNS_V2 modifycolumnCOMMENTvarchar(256)characterset utf8;2).修改表注释字符集

altertable TABLE_PARAMS modifycolumn PARAM_VALUE varchar(4000)characterset utf8;3).修改分区表参数,以支持分区键能够用中文表示

altertable PARTITION_PARAMS modifycolumn PARAM_VALUE varchar(4000)characterset utf8;altertable PARTITION_KEYS modifycolumn PKEY_COMMENT varchar(4000)characterset utf8;4).修改索引注解

mysql>altertable INDEX_PARAMS modifycolumn PARAM_VALUE varchar(4000)characterset utf8;
标签: hive sql hadoop

本文转载自: https://blog.csdn.net/S1406793/article/details/135721478
版权归原作者 S1406793 所有, 如有侵权,请联系我们删除。

“Hive-SQL语法大全”的评论:

还没有评论