hive 笔记(有点乱,凑合看)
作者:互联网
hive 笔记(有点乱,凑合看)
set hive.map.aggr=true;
set hive.groupby.skewindata=true;
set hive.merg.mapfiles=true;
set hive.mergejob.maponly=true;
set hive.merge.mapfiles = true;
set hive.merge.mapredfiles = true;
set hive.merge.size.per.task = 256*1000*1000;
set hive.default.fileformat=RCFile;
set hive.exec.compress.output=true;
set hive.auto.convert.join=false;
set hive.tez.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true; --开启小文件合并
set hive.merge.size.per.task = 256000000;
set hive.merge.smallfiles.avgsize = 256000000;
set hive.merge.tezfiles=true;
set hive.exec.reducers.bytes.per.reducer = 256000000;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nostrict;
set mapred.min.split.size = 256000000;
set mapred.min.split.size.per.node = 256000000;
set mapred.min.split.size.per.rack = 256000000;
set hive.cli.print.current.db=true;
set hive.execution.engine=tez;
set mapped.queue.name = llap;
=================================================
set mapred.reduce.tasks=3
select a.* from test_order.order_20160101 a
order by user_name desc
sort by user_name desc
limit 5
;
---------------------------------------------------------
1、现有queue两个 default=90%,llap=10%
现hive架构为hive on tez;未发现该架构配置queue to user的方式;通过手动设置的方式去提交application到指定queue。
2、在执行hive SQL前需要手动设置
在执行hive SQL前需要手动设置,现有queue两个 default=90%,llap=10%,根据情况调整:
set tez.queue.name=llap; //使用llap队列需要手动指定
set tez.queue.name=default; //默认是使用default队列,如果使用该队列无须做上述操作。
如:
set hive.execution.engine=tez;
set tez.queue.name=llap;
select count(*) from ods_bi_dev.welife_welife_qrcode_logs t where qupdated='null' ;
select count(order_id) from test_order.order_20160101 a order by order_id ;
select * from ( select * from test_order.order_20160101 a order by order_id) t limit 5;
select sum(*) from ( select * from test_order.order_20160101 a order by order_id) t;
select count(*) from ( select * from test_order.order_20160101 a order by order_number) t ace ;
select max(order_number) from ( select * from test_order.order_20160101 a order by order_number) t limit 5;
select max(order_number) from ( select * from test_order.order_20160101 a order by order_number) t limit 5;
hive修改表名
alter table old_table_name rename to new_table_name;
hive复制表结构
create table new_table_name like table_name;
但是排序只能是倒序排序,不能指定排序规则为asc[倒序] 或者desc[正序]。
查看hive数据库:
show databases like 'tes*'
创建hive数据库
CREATE DATABASE IF NOT EXISTS db;
hive模糊搜索表
show tables like '*name*';
杀死某个任务 在hive shell中执行
hadoop job -kill job_201403041453_58315(作业ID)
解析hql语句的执行过程
explain select sum(id) from book;
普通表
load data local inpath '/xxx/xxx/dim_cube.txt' overwrite into table table_name;
或者
insert overwrite table book select * from table_name where dt='2014-01-22' limit 100
静态分区表
load data local inpath '/hadoop_tmp/11' overwrite into table book partition (pubdate='2010-08-22');
或
insert overwrite table book partition(pubdate='2010-08-22') select id,name from book2 where pubdate='2010-08-22';
多个分区
FROM book2 se
INSERT OVERWRITE TABLE book
PARTITION (pubdate='2010-08-22')
SELECT id,name WHERE pubdate='2010-08-22'
INSERT OVERWRITE TABLE book
PARTITION (pubdate='2010-08-23')
SELECT id,name WHERE pubdate='2010-08-23'
INSERT OVERWRITE TABLE book
PARTITION (pubdate='2010-08-24')
SELECT id,name WHERE pubdate='2010-08-24';F
2)、根据数据长度选择合适的类型
TINYINT (1字节,数据范围: -128 to 127)
SMALLINT (2字节,数据范围: -32,768 to 32,767)
INT (4字节,数据范围:-2,147,483,648 to 2,147,483,647)
BIGINT (8字节,数据范围: -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807)
FLOAT (4字节, 单精度浮点数)
DOUBLE (8字节,双精度浮点数)
hive.map.aggr=true;Map 端部分聚合,相当于Combiner
hive.groupby.skewindata=true;有数据倾斜的时候进行负载均衡,当选项设定为 true,生成的查询计划会有两个 MR Job。
倾斜的逻辑
hive.groupby.skewindata=true
合并小文件
hive.merg.mapfiles=true:合并map输出
hive.merge.mapredfiles=false:合并reduce输出
hive.merge.size.per.task=256*1000*1000:合并文件的大小
hive.mergejob.maponly=true:如果支持CombineHiveInputFormat则生成只有Map的任务执行merge
hive.merge.smallfiles.avgsize=16000000:文件的平均大小小于该值时,会启动一个MR任务执行merge。
hive.merge.mapfiles=true; #在Map-only的任务结束时合并小文件
hive.merge.mapredfiles = true #在Map-Reduce的任务结束时合并小文件
hive.merge.size.per.task = 256*1000*1000 #合并文件的大小
hive.merge.smallfiles.avgsize=16000000 #当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
Reduce个数
hive.exec.reducers.bytes.per.reducer=<number> #每个reduce任务处理的数据量
hive.exec.reducers.max=<number> #每个任务最大的reduce数目
mapreduce.job.reduces=<number> #强制指定启动的reduce数
DefaultCodeC + RCFile的压缩方式均为最优,但使用该方式,会使得Pig 和Impala 无法使用(Impala的不兼容不确定是否是暂时的)。而DefaultCodeC+ SequenceFile 在压缩比,查询性能上略差于RCFile (压缩比约 6:5), 但可以支持 Impala实时查询。
立即压缩--注意: 1、Map阶段输出不进行压缩 2、对输出文本进行处理时不压缩
set hive.default.fileformat=RCFile;
SET hive.exec.compress.output=true;
创建表时指定压缩方式,默认不压缩,以下为示例:
create external table track_hist(
id bigint, url string, referer string, keyword string, type int, gu_idstring,string,ext_field10 string
)partitioned by (ds string) stored as RCFile location '/data/share/track_histk' ;
2. 插入数据是设定立即压缩
SET hive.exec.compress.output=true;
insert overwrite table track_histpartition(ds='2013-01-01')
select id,url, ext_field10 fromtrackinfo where ds='2013-01-01';
Hive-0.13.0之前不支持in 子查询,可以用left semi join的方式来替换in;not in可以用left outer join方式来替换
1.insert into是增加数据
2.insert overwrite是删除原有数据然后在新增数据,如果有分区那么只会删除指定分区数据,其他分区数据不受影响
分区表加载数据:
load data local inpath '/home/daxin/jdata/boy' into table dogpartition(sex="boy");
load data local inpath '/home/daxin/jdata/girl' into table dogpartition(sex="girl");
注意:sex属性是数据集里面没有的属性,这个是提前分类好的数据然后加载。
alter table pms.test_mobile_log add partition (ds='2015-05-27', hour='14') location '/user/pms/workspace/ouyangyewei/temp2/category.txt';
执行之后sex=boy下面的taidi、changmao两种数据都会被删除。可以这么理解:树的根节点删除,子节点当然也跟随删除了
alter table dog drop partition(sex='boy');
二、技术细节
1、一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。
2、表和列名不区分大小写。
3、分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。
4、建表的语法(建分区可参见PARTITIONED BY参数):
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path]
5、分区建表分为2种,一种是单分区,也就是说在表文件夹目录下只有一级文件夹目录。另外一种是多分区,表文件夹下出现多文件夹嵌套模式。
a、单分区建表语句:create table day_table (id int, content string) partitioned by (dt string);单分区表,按天分区,在表结构中存在id,content,dt三列。
b、双分区建表语句:create table day_hour_table (id int, content string) partitioned by (dt string, hour string);双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。
表文件夹目录示意图(多分区表):
6、添加分区表语法(表已创建,在此基础上添加分区):
ALTER TABLE table_name ADD partition_spec [ LOCATION 'location1' ] partition_spec [ LOCATION 'location2' ] ... partition_spec: : PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)
用户可以用 ALTER TABLE ADD PARTITION 来向一个表中增加分区。当分区名是字符串时加引号。例:
ALTER TABLE day_table ADD PARTITION (dt='2008-08-08', hour='08') location '/path/pv1.txt' PARTITION (dt='2008-08-08', hour='09') location '/path/pv2.txt';
7、删除分区语法:
ALTER TABLE table_name DROP partition_spec, partition_spec,...
用户可以用 ALTER TABLE DROP PARTITION 来删除分区。分区的元数据和数据将被一并删除。
例:
ALTER TABLE day_hour_table DROP PARTITION (dt='2008-08-08', hour='09');
alter table appdata_bi.acd_dprpt_welife_partner_view_w drop partition(dt_time=20180101);
alter table appdata_bi.acd_dprpt_welife_partner_view_w add partition(dt_time=20171216);
8、数据加载进分区表中语法:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
例:
LOAD DATA INPATH '/user/pv.txt' INTO TABLE day_hour_table PARTITION(dt='2008-08- 08', hour='08'); LOAD DATA local INPATH '/user/hua/*' INTO TABLE day_hour partition(dt='2010-07- 07');
当数据被加载至表中时,不会对数据进行任何转换。Load操作只是将数据复制至Hive表对应的位置。数据加载时在表下自动创建一个目录,文件存放在该分区下。
9、基于分区的查询的语句:
SELECT day_table.* FROM day_table WHERE day_table.dt>= '2008-08-08';
10、查看分区语句:
show partitions day_hour_table; OK dt=2008-08-08/hour=08 dt=2008-08-08/hour=09 dt=2008-08-09/hour=09
3) 修改表Hive表对应的目录
ALTER TABLE um_appuser SET LOCATION 'hdfs://node1:8020/user/hive/um_appuser';
4) 转换为外部表
ALTER TABLE um_appuser SET TBLPROPERTIES ('EXTERNAL'='TRUE');
--set hive.execution.engine=mr;
--set mapreduce.job.queuename=llap;
--打印列头字段名
set hive.cli.print.header=true;
set hive.cli.print.current.db=true;
set hive.cli.print.row.to.vertical=true; // 开启行转列功能, 前提必须开启打印列名功能
set hive.cli.print.row.to.vertical.num=1; // 设置每行显示的列数
-- 行转列功能
-- 开启行转列功能, 前提必须开启打印列名功能
set hive.cli.print.row.to.vertical=true;
-- 设置每行显示的列数
set hive.cli.print.row.to.vertical.num=1;
---------------------
设置引擎
set hive.execution.engine=mr;
set hive.execution.engine=spark;
set hive.execution.engine=tez;
set hive.execution.engine=tez;
set tez.queue.name=default;
如果使用的引擎是tez
set tez.queue.name=etl
设置队列(etl为队列名称,默认为default)
如果使用的是mr(原生mapreduce)
SET mapreduce.job.queuename=etl;
如果使用的引擎是 etl
tezset tez.queue.name=etl 设置队列(etl为队列名称,默认为default)
set hive.execution.engine=tez;
set tez.queue.name=default;
set hive.cli.print.header=true;
set hive.cli.print.current.db=true;
-- 设置hive的计算引擎为spark
set hive.execution.engine=spark;
-- 修复分区
set hive.msck.path.validation=ignore;
msck repair table sub_ladm_app_click_day_cnt;
-- 打印表头
set hive.cli.print.header=true;
set hive.cli.print.row.to.vertical=true;
set hive.cli.print.row.to.vertical.num=1;
-- 显示当前数据库
set hive.cli.print.current.db=true;
// 开启任务并行执行
set hive.exec.parallel=true;
// 同一个sql允许并行任务的最大线程数
set hive.exec.parallel.thread.number=8;
-- 从本地文件加载数据:
LOAD DATA LOCAL INPATH '/home/hadoop/input/ncdc/micro-tab/sample.txt' OVERWRITE INTO TABLE records;
load data local inpath '/home/hive/partitions/files' into table logs partition (dt='2017-08-01',country='GB');
-- 数组、map、结构
select col1[0],col2['b'],col3.c from complex;
--导出orc文件
hive --orcfiledump /user/hive/warehouse/sx_360_safe.db/user_reg_info_init2
-- 导出hive表数据
insert overwrite local directory '/tmp/tmp_20170830/app_210_s3_1016' row format delimited fields terminated by ',' select * from app_210_s3_1016;
cd /tmp/tmp_20170830/sub_ladm_exc_app_210_s3_1016
cat * > /tmp/tmp_20170830/result/app_210_s3_1016.csv
cd /tmp/tmp_20170830/result/
gzip app_210_s3_1016.csv
-- hive生成统一ID
2 select regexp_replace(reflect("java.util.UUID", "randomUUID"), "-", "");
-----------------------------------------------------------------------------
ALTER TABLE shphonefeature DROP IF EXISTS PARTITION(year = 2015, month = 10, day = 1);删除掉指定分区
确认主建唯一性:
select t.cfid,t.num from (select cfid,count(1) num from welife_cashier_fingerprint group by cfid ) t where t.num >1 order by t.num desc ;
查询重读条数:
select username,count(*) as count from hk_test group by username having count>1;
SELECT username,count(username) as count FROM hk_test GROUP BY username HAVING count(username) >1 ORDER BY count DESC;
查询重读条数:
select bidid,count(*) as count from (select concat(bid,id) bidid from welife_welife_users_update_multiple ) t group by bidid having count>1 limit 40;
SELECT bidid,count(bidid) as count FROM (select concat(bid,id) bidid from welife_welife_users_update_multiple ) t GROUP BY bidid HAVING count(bidid) >1 ORDER BY count DESC;
---------------------------------------------------------
3、spark可以通过在执行命令添加
--queue llap
指定llap队列执行该application
//默认是使用default队列,如果使用该队列无须做上述操作
regexp_replace() 和 from_unixtime() 比较?
regexp_replace() 是字符串替换函数
from_unixtime() 是时间格式化函数
第一个是处理字符串的,第二个是专门处理时间的,如果是咱们的处理时间 建议用第二个
如果用第一个的话 ,得用to_date把时间转换成字符串才行
如:
regexp_replace(to_date(a.updatetime),'-','') <= '20180808' #不建议使用
from_unixtime(unix_timestamp(updatetime),'yyyyMMdd') <='20180808' #建议使用
HIVE修改表名
alter table old_table_name rename to new_table_name;
HIVE复制表结构
create table new_table_name like table_name;
HIVE添加字段
alter table table_name add columns(columns_values BIgint comment 'comm_text');
创建内部表
create table if not exists table_name
(字段名 字段类型)
partitioned by (pt string)
row format delimited
fields terminated by '\t' 字段分隔符
stored as textfile; 文件格式为文本型存储
创建外部表
create external table table_name
(字段名 字段类型)
partitioned by (pt string)
row format delimited
fields terminated by '\1' 字段分隔符
lines terminated by '\2' 行分隔符
stored as textfile 文件格式为文本型存储
=============================================================================
sqoop export \
--connect 'jdbc:mysql://59.110.7.160:3306/alipos_new?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull' \
--username 'sundawei' \
--password 'YunHaiYao@2009#POS' \
--table 'welife_users' \
--export-dir '/apps/hive/warehouse/expdata_bi.db/welife_welife_users_yhy' \
--input-fields-terminated-by '\001' \
--lines-terminated-by '\n' \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
-m 3
=----------------------------------------------------------
echo -e "请输入:\c" 和 echo -n "请输入:"
hive 打印详细信息
hive -hiveconf hive.root.logger=DEBUG,console
-------------------------------------
gitlab表字段描述位置:表字段描述位置:
http://git.dev.acewill.net/welife/Trade/tree/master/src/Entity
都是 Entity里面
http://git.dev.acewill.net/welife/XXXX/tree/master/src/Entity
你需要变更xxxx 去找表结构
字段描述都在Entity里面,DAO里面是对应的数据库和表
====================================================================================================
select * from ods_bi.welife_welife_tag2users_update_multiple having count(distinct id,uid)>1 limit 10;
select uid,count(1) from ods_bi.welife_welife_tag2users_update_multiple t group by uid having count(uid)>1 limit 10;
select uid,count(1) from ods_bi.welife_welife_tag2users_update_multiple t having count(DISTINCT uid)>1 limit 10;
select id,uid,count(1) num from ods_bi.welife_welife_tag2users_update_multiple having count(id,uid)>1 limit 10;
select t2uid,count(1) num from ods_bi.welife_welife_tag2users_update_multiple group by t2uid order by num desc limit 10
select * from (select id,uid,count(1) num from ods_bi.welife_welife_tag2users_update_multiple t group by id,uid ) a where num >1 limit 50 ;
sqoop export \
--connect 'jdbc:mysql://59.110.7.160:3306/alipos_new?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull' \
--username 'sundawei' \
--password 'YunHaiYao@2009#POS' \
--table 'welife_users' \
--export-dir '/apps/hive/warehouse/expdata_bi.db/welife_welife_users_yhy' \
--input-fields-terminated-by '\001' \
--lines-terminated-by '\n' \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
-m 3
hive -hivevar v_date='20170630' -S -f test_par.hql
修改mysql字段长度:
use wedatas;
alter table wedatas_welife_user_assessments_v2s modify column `title1Other` varchar(2100) NOT NULL DEFAULT '' COMMENT '评价2备注';
闭链数据:
select y.start_dt,count(1) from ods_bi.welife_welife_managers_update_default y
where from_unixtime(unix_timestamp(y.updatetime),'yyyyMMdd') = date_sub(to_date(y.end_dt), 1)
-- date_add(from_unixtime(unix_timestamp(y.updatetime),'yyyyMMdd'), 1) = to_date(y.end_dt)
and y.end_dt > '20180701'
group by y.start_dt ;
日期增加函数 date_add(start_date, num_days)
返回类型:string
描述:返回增加num_days 天数的日期(负数则为减少)
date_add(start_date, num_days) - Returns the date that is num_days after start_date.
实例:
hive>select date_add('2014-09-16 15:50:08.119',10) from default.dual;
2014-09-26
hive>select date_add('2014-09-16 15:50:08.119',-10) from default.dual;
2014-09-06
9.日期减少函数 date_sub(start_date, num_days)
返回类型:string
描述:返回num_days 天数之前的日期(负数则为增加)
date_sub(start_date, num_days) - Returns the date that is num_days before start_date.
实例:
hive>select date_sub('2014-09-16 15:50:08.119',10) from default.dual;
2014-09-06
hive>select date_sub('2014-09-16 15:50:08.119',-10) from default.dual;
2014-09-26
10.周期函数 weekofyear(start_date, num_days)
返回类型:int
描述:返回当前日期位于本年的周期 一周一个周期
weekofyear(date) - Returns the week of the year of the given date. A week is considered to start on a Monday and week 1 is the first week with >3 days.
实例:
hive>select weekofyear('2014-09-16 15:50:08.119') from default.dual;
38
11.日期比较函数 weekofyear(start_date, num_days)
返回类型:string
描述:返回2个时间的日期差
datediff(date1, date2) - Returns the number of days between date1 and date2
date1-date2
实例:
hive>select datediff('2014-09-16 15:50:08.119','2014-09-15') from default.dual;
1
--统计微信点餐今年1-7月份各个商家的订单流水情况统计汇总
SELECT
from_unixtime(unix_timestamp(a.tclCreated),'yyyyMM') mon,
a.bid,
b.bBrandName,
count(*) as `统计汇总`
FROM ods_bi.welife_welife_trade_consume_logs_stream_default a
LEFT JOIN (select bid,bBrandName,updatetime
from ods_bi.welife_welife_bizs_update_default
where from_unixtime(unix_timestamp(updatetime),'yyyyMMdd') >= '20180101'
and from_unixtime(unix_timestamp(updatetime),'yyyyMMdd') < '20180801'
and end_dt >'20180801'
) b ON a.bid=b.bid
WHERE from_unixtime(unix_timestamp(a.updatetime),'yyyyMMdd') >='20180101'
and a.tcPayType=6
AND a.tcType=2
AND a.tclTradeType=1
AND a.tcPayType=6
AND tcSourceType=1
and nvl(length(get_json_object(a.tcRemark, '$.weixinPayId' )),0) > 0 --提取json数据 大于0 说明有值
GROUP BY a.bid,b.bBrandName,from_unixtime(unix_timestamp(a.tclCreated),'yyyyMM')
while true;do aa=`ll -tlr |awk '{print$9}'|tail -1 ` ; tail -200f $aa ;sleep 2 ; done
====================================================================================================
1.建立历史表
create external table history(imei string, version string) partitioned by (event_day string)
row format delimited fields terminated by '\t';
2.加载历史表文件到hive表中,此处我用的是本地文件映射到hive中,而非集群路径,具体路径要看你实际
load data local inpath '/home/work/fangguoqing/log/history' overwrite into table history partition (event_day='20140709');
3.抽样检查,看是否导入成功
select * from history where event_day='20140709' limit 20;
1.建立每天数据表
create external table day(imei string, stat_day string, stat_hour string, version string, channel string, os_name string, os_version string, action_type string,
ip string) partitioned by (event_day string) row format delimited fields terminated by '\t';
2.加载天数据文件到hive表中,此处我用的是本地文件映射到hive中,而非集群路径,具体路径要看你实际
load data local inpath '/home/work/data/log/today' overwrite into table day partition (event_day='20140710');
load data local inpath '/home/work/data/log/second' overwrite into table day partition (event_day='20140711');
3.抽样检查,看是否导入成功
select * from day where event_day='20140710' limit 20;
1.新增
select count(*)
from
(select imei from day where event_day='20140710') a
left outer join
(select imei from history where event_day='20140709') b
on a.imei = b.imei
where b.imei is null;
2.次日留存
select count(*)
from
(select imei from day where event_day='20140710') a
left outer join
(select imei from history where event_day='20140709') b
on a.imei = b.imei
left semi join
(select imei from day where event_day='20140711')c
on a.imei = c.imei
where b.imei is null;
3.老用户
select count(*)
from
(select imei from day where event_day='20140710') a
left semi join
(select imei from history where event_day='20140709') b
on a.imei = b.imei;
4.日活
select count (distinct imei) from day where event_day='20140710';
5.历史
select count(distinct imei) from
(
select imei from day where event_day='20140710'
union all
select imei from history where event_day='20140709'
union all
select imei from day where event_day='20140709'
)a
1.队列与优先级
http://www.cnblogs.com/ggjucheng/archive/2012/07/25/2608817.html
http://blog.csdn.net/jiedushi/article/details/7920455
2.hive表结构修改
http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843393.html
http://blog.csdn.net/xiaoping8411/article/details/7605039
3.讲课定位
4.机器学习是机器在学习人,人的长处是识别与推理,所见所闻、自身经历、别人观点去学习知识,机器没有主观能力,主要是面对数据,就是人的所做所为,还有多媒体数据,评分数据等等,机器没有眼睛,对数据量与质量有要求,大数据不缺量,
5.好的学习方式,记录方式,解决问题的能力
huoyue <- dau$活跃用户数
plot(huoyue)
plot(ts(huoyue))
plot(decompose(ts(huoyue)))
wfit <- lm(weight ~ height + I(height^2),data=women)
plot(women)
lines(women$height,fitted(wfit))
predict(wfit, data.frame(height<-c(60)))
SELECT REPLACE(partition_name,'p_','') p_max FROM INFORMATION_SCHEMA.PARTITIONS WHERE table_name='wedatas_welife_user_assessments_stat_score_v2' and partition_name='p_20180712';
SELECT partition_name part,partition_expression expr, partition_description descr, table_rows FROM INFORMATION_SCHEMA.partitions WHERE TABLE_SCHEMA = SCHEMA()
AND TABLE_NAME='wedatas_welife_user_assessments_stat_v2' and descr>'20180707';
select date_format(UpdateTime,'%Y-%m-%d') ftime,count(1) from welife_trade_consume_products where UpdateTime>='2017-08-20 23:59:59' group by ftime;
select from_unixtime(unix_timestamp(tcpCreated),'yyyyMMdd') tcpCreated,bid,sid,
regexp_replace(regexp_replace(regexp_replace(tcpList, '^\\[', ''), '\\]$', ''), '\\},\\{', '\\}\&\\{') tcpList
from ods_bi.welife_welife_trade_consume_products_stream_default
where dt_time='20180829'
and from_unixtime(unix_timestamp(tcpCreated),'yyyyMMdd')='20180829'
limit 30;
例子:格式化当前日期为 年月日时分秒
DATE_FORMAT(NOW() , '%Y-%m-%d %H:%i:%s')
注意。在有些情况下要使用转义字符,以下的等号要用双竖线转义,这是java正則表達式的规则。
select data_field,
regexp_extract(data_field,'.*?bgStart\\=([^&]+)',1) as aaa,
regexp_extract(data_field,'.*?contentLoaded_headStart\\=([^&]+)',1) as bbb,
regexp_extract(data_field,'.*?AppLoad2Req\\=([^&]+)',1) as ccc
from pt_nginx_loginlog_st
where pt = '2012-03-26'limit 2;
=============================================================================
奥琦玮导数据(8月上线门店和续约门店)
解决php值班人员反馈问题3个
青年餐厅 ID: 1148244516 18324603697 (密码同)魔方中一个等级下的数据为0
mysqlquery welife "select count(*) from welife3.welife_users3 where bid=1148244516 and ccid=3011246 \G"
========================================================================================================================
命令行模式,或者说目录模式,可以使用hive 执行命令。
选项说明:
-e : 执行短命令
-f : 执行文件(适合脚本封装)
-S : 安静模式,不显示MR的运行过程
-hivevar : 传参数 ,专门提供给用户自定义变量。
-hiveconf : 传参数,包括了hive-site.xml中配置的hive全局变量。
例子1:hive -e 查询
命令: hive -S -e "use default; select * from kimbo_test limit 3;"
例子2:hive -f 执行文件
命令: hive -S -f test_k.hql -- 返回3条记录
例子3:hive -f 参数传递,执行文件
命令: hive -hivevar v_date='20170630' -S -f test_par.hql -- 返回3条记录
命令: hive -hivevar v_date='20170101' -S -f test_par.hql -- 返回0条记录
查看文件内容:
cat test_par.hql
use default; select * from kimbo_test where dt='${hivevar:v_date}' limit 3;
cat test_k.hql
use default; select * from kimbo_test limit 3;
-d <driver class> ---使用一个驱动类:beeline -d driver_class
-e <query> ---使用一个查询语句:beeline -e "query_string"
-f <file> ---加载一个文件:beeline -f filepath 多个文件用-e file1 -e file2
-n <username> ---加载一个用户名:beeline -n valid_user
-p <password> ---加载一个密码:beeline -p valid_password
-u <database URL> ---加载一个JDBC连接字符串:beeline -u db_URL
总结
本文主要阐述了两种在hive中使用变量的方法,第一种是在shell中定义变量然后在hive -e的SQL语句中直接用${var_name}的方法调用;
第二种是使用hive –hiveconf key=value –f run.sql模式使用-hiveconf来设置变量,然后在SQL文件中使用${hiveconf:varname}的方法调用。
用这两种方法可以满足开发的时候向hive传递参数的需求,会很好的提升开发效率和代码质量。
表格 4 hivevar 和 hiveconf 传递变量的方法
hive -hivevar -f file |
hive?-hivevar tbname=’a’ -hivevar count=10? |-f filename.hql
|
hive -hivevar -e cmd |
hive?-hivevar tbname=’a’ -hivevar count=10 ?|-e ‘select * from ${hivevar:tbname} limit ${hivevar:count}’
|
hive -hiveconf -f file |
hive?-hiveconf tbname=’a’ – hiveconf count=10|?-f filename.hql
|
hive -hiveconf -e cmd |
hive?-hiveconf tbname=’a’ -hiveconf count=10 |?-e ‘select * from ${hivevar:tbname} limit ${hivevar:count}’
|
echo " 格 4 hivevar 和 hiveconf 传递变量的方法"
echo "hive -hiveconf -e cmd "
echo "hive?-hiveconf tbname=’a’ -hiveconf count=10?-e ‘select * from ${hivevar:tbname} limit ${hivevar:count}’ "
hive -hivevar v_date='20170630' -S -f test_par.hql
hive -hivevar v_date='20180708' -e"select * from ods_bi_beta.welife_welife_users_update_multiple t where start_dt='${hivevar:v_date}' limit 1;"
2、hive在1.0版本之后,支持了hive -f 的参数传递,且支持多参数的传递
使用如下:
test.sql
select * from ods.tracklog where day='${hiveconf:day}' and requesturl like '%${hiveconf:url}%' limit 15
调用方式如下:
hive -hiveconf day=20151115 -hiveconf url=licaike -f test.sql
结果正常返回
3、总结,生产中 hive -e 与 hive -f 都可以使用,hive -f 解决了参数传递的问题将更多的用在生产中
hive?-hivevar tbname=’a’ -hivevar count=10 ?|-e ‘select * from ${hivevar:tbname} limit ${hivevar:count}’
hive?-hiveconf tbname=’a’ -hiveconf count=10 |?-e ‘select * from ${hivevar:tbname} limit ${hivevar:count}’
======================================================================
spark 分区数 设置
--conf spark.sql.shuffle.partitions=200
set spark.sql.shuffle.partitions=200;
os.system("spark-submit --master yarn-client --driver-memory 5g \
--executor-cores 10 --num-executors 30 --executor-memory 10g \
--conf spark.sql.shuffle.partitions=500 --class cn.acewill.magic.spark.MagicCubeMain "+pro_dir+"/jar/spark_acewill_oldreport.jar "
+db_app+" "+db_in+" "+run_day+" "+trade_consumes_table+" "+trade_charges_table+" "+coupon2users_table+" "+user_savings_table+" "+user_credit_tabl
e+" "+user_qrcodes_table+" "+users_table+" "+app_charges_table+" "+app_consumes_table+" "+app_summary_table+" "+app_mvm_table+" "+ods_tags_table+
" "+ods_tag2users_table+" "+ods_bidMvm_table+">> "+log_dir+"/dataCube.log 2>&1 ")
======================================================================
使用python访问hive进行数据库创建,代码如下:
https://blog.csdn.net/yidu_fanchen/article/details/77680657
from pyhive import hive
from TCLIService.ttypes import TOperationState
# 打开hive连接
hiveConn = hive.connect(host='192.168.83.135',port=11111)
cursor = hiveConn.cursor()
# 执行sql语句
sql = ''' CREATE DATABASE userdbbypy '''
cursor.execute(sql, async=True)
# 得到执行语句的状态
status = cursor.poll().operationState
print "status:",status
# 关闭hive连接
cursor.close()
hiveConn.close()
————————————————
-- 删除库
drop database if exists db_name;
-- 强制删除库
drop database if exists db_name cascade;
-- 删除表
drop table if exists employee;
-- 清空表
truncate table employee;
-- 清空表,第二种方式
insert overwrite table employee select * from employee where 1=0;
-- 删除分区
alter table employee_table drop partition (stat_year_month>='2018-01');
-- 按条件删除数据
insert overwrite table employee_table select * from employee_table where id>'180203a15f';
————————————————
beeline -u jdbc:hive2://10.12.9.93:10000 -n hdfs
-----------------------------: mysql
alter命令可执行对表的结构进行修改:
1、添加一列
alter table tablename add newfile definition;
2、改变表的数据类型
alter table tablename change columname newdefinition;
3、给表添加索引
alter table tablename add index columname newdefinition;
4、给表添加唯一列
alter table tablename add unique columname ...
5、从表中删除一列
alter table tablename drop columname;
---------------------------------------------------------------------------------------------
-- 1、ODS层内部表(第一种写法)
DROP TABLE IF EXISTS DEV_EAM.ODS_EAM_MAXIMO_UDBAINFO_SMT;
CREATE TABLE DEV_EAM.ODS_EAM_MAXIMO_UDBAINFO_SMT (
BDCZBRQ STRING COMMENT '变电出质保日期',
BGLX STRING COMMENT '变更类型',
BRANCH STRING COMMENT '运营中心',
BWDATE STRING COMMENT '并网时间',
) COMMENT '风电厂基本信息表' PARTITIONED BY (dm STRING)
ROW FORMAT DELIMITED NULL DEFINED AS ''
STORED AS ORCFILE;
-- 1、ODS层内部表(第二种写法)
-- 设置分区数量
set spark.sql.shuffle.paritions=5;
-- 关闭自动广播小表
set spark.sql.autoBroadcastJoinThreshold=-1;
-- 是否开启动态资源配置
set spark.dynamicAllocation.enabled=true;
DROP TABLE IF EXISTS DEV_EAM.ODS_EAM_MAXIMO_UDBAINFO_SMT;
CREATE TABLE DEV_EAM.ODS_EAM_MAXIMO_UDBAINFO_SMT (
BDCZBRQ STRING COMMENT '变电出质保日期',
BGLX STRING COMMENT '变更类型',
BRANCH STRING COMMENT '运营中心',
BWDATE STRING COMMENT '并网时间',
) COMMENT '风电厂基本信息表' PARTITIONED BY (dm STRING COMMENT '分区')
ROW FORMAT DELIMITED fields terminated by '\001'
lines terminated by '\n' NULL DEFINED AS ''
STORED AS PARQUET;
-----------------
drop table if exists demo_dim_address_city;
create table if not exists demo_dim_address_city
(
address_id bigint comment '业主⼩小区id'
,address string comment '业主⼩小区'
, city string comment '城市'
)
comment'⼩小区和城市映射维表'
row format delimited
fields terminated by'\t'
lines terminated by'\n'
stored as textfile;
如果想都放进去,就把字段的长度或类型改一下;
比如 Varchar 的长度是很有限的,那你就可以用 Text、mediumtext,longtext;
或者你也可以用 blob,mediumblob,longblob;
====================================================sparksql优化
-- 设置分区数量
set spark.sql.shuffle.paritions=5;
-- 关闭自动广播小表
set spark.sql.autoBroadcastJoinThreshold=-1;
-- 是否开启动态资源配置
set spark.dynamicAllocation.enabled=true;
//1.下列Hive参数对Spark同样起作用。
set hive.exec.dynamic.partition=true; // 是否允许动态生成分区
set hive.exec.dynamic.partition.mode=nonstrict; // 是否容忍指定分区全部动态生成
set hive.exec.max.dynamic.partitions = 100; // 动态生成的最多分区数
//2.运行行为
set spark.sql.shuffle.partitions; // 需要shuffle是mapper端写出的partition个数
set spark.sql.autoBroadcastJoinThreshold; // 大表 JOIN 小表,小表做广播的阈值
set spark.dynamicAllocation.enabled; // 是否开启动态资源配置,根据工作负载来衡量是否应该增加或减少executor,默认false
set spark.dynamicAllocation.maxExecutors; //开启动态资源分配后,最多可分配的Executor数
set spark.dynamicAllocation.minExecutors; //开启动态资源分配后,最少可分配的Executor数
set spark.sql.adaptive.enabled; // 是否开启调整partition功能,如果开启,spark.sql.shuffle.partitions设置的partition可能会被合并到一个reducer里运行
set spark.sql.adaptive.shuffle.targetPostShuffleInputSize; //开启spark.sql.adaptive.enabled后,两个partition的和低于该阈值会合并到一个reducer
set spark.sql.adaptive.minNumPostShufflePartitions; // 开启spark.sql.adaptive.enabled后,最小的分区数
set spark.hadoop.mapreduce.input.fileinputformat.split.maxsize; //当几个stripe的大小大于该值时,会合并到一个task中处理
//3.executor能力
set spark.executor.memory; // executor用于缓存数据、代码执行的堆内存以及JVM运行时需要的内存
set spark.yarn.executor.memoryOverhead; //Spark运行还需要一些堆外内存,直接向系统申请,如数据传输时的netty等。
set spark.sql.windowExec.buffer.spill.threshold; //当用户的SQL中包含窗口函数时,并不会把一个窗口中的所有数据全部读进内存,而是维护一个缓存池,当池中的数据条数大于该参数表示的阈值时,spark将数据写到磁盘
set spark.executor.cores; //单个executor上可以同时运行的task数
之前一直用thrift链接Hive,但在运行时总出现问题,一直报缺少模块的错误,装了这个模块,又报缺少那个模块,连了半天,全是泪啊!
原来thrift链接Hive的.py文件后续没人维护,是连不上的。
果断放弃thrift,直接用impala,哈哈,终于连上了,我那个兴奋啊,你懂的。
需要的亲们,直接拿去用吧。
from impala.dbapi import connect
conn = connect(host="10.1.2.72", port=10000,database="moreqinrdb")
########链接Hive
cursor = conn.cursor()
cursor.execute("SELECT * FROM COMPANY_BUSINESS_INFO")
results = cursor.fetchall()
colname=[]
coladdress=[]
colscope=[]
for data in results:
colname.append(data[0])
coladdress.append(data[12])
colscope.append(data[13])
print(coladdress,'\n')
D:\soft_work\JetBrains\Anaconda3\envs\Anaconda2
activate Anaconda2
15112345678/dtwave@2018
spark中split()特殊符号"." "|" "*" "\" "]"
关于点的问题是用string.split("[.]") 解决。
关于竖线的问题用 string.split("\\|")解决。
关于星号的问题用 string.split("\\*")解决。
关于斜线的问题用 sring.split("\\\\")解决。
关于中括号的问题用 sring.split("\\[\\]")解决。
【Hive】split函数(分割字符串)
https://blog.csdn.net/qq_34105362/article/details/80408621
hive> select split('ab_cd_ef', '\_')[0] from test;
ab
hive> select split('ab?cd_ef', '\\?')[0] from test;
ab
如:
正确的写法:
split('192.168.0.1','\\.')
得到的结果:
["192","168","0","1"]
需要注意的是:
当然当split包含在 "" 之中时 需要加4个\
如 hive -e ".... split('192.168.0.1','\\\\.') ... " 不然得到的值是null
同样的 | 等特殊符号也需要做类似 处理。
利用表达式
echo 'hello' | tr 'a-z' 'A-Z'
echo 'HELLO' | tr 'A-Z' 'a-z'
’
结果:
HELLO
hello
=========================PostgreSQL ===========================================
命令行登录
1、首先切换到postgres用户,一般数据库安装都会指定一个postgres用户:
su postgres
2、登录数据库命令:psql -U user_name -d database_name -h serverhost
例如:psql -h 127.0.0.1 -d mydata -U dbuser
3、查看帮助: help
\h #查看所有的sql关键字
\? #命令行操作的帮助
\d #查看当前schema 中所有的表
\q #退出pg命令行
\d #schema.table 查看表的结构
\x #横纵显示切换
\dT+ #显示扩展类型相关属性及描述
\l #列出所有的数据库
\timing #显示执行时间
\c database_name #切换数据库
set search to schema #切换schema
explain sql #解释或分析sql执行过程
CREATE TABLE workorder(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
-- 给字段加注释:
comment on column workorder.id is '主键ID,自增';
comment on column workorder.NAME is '姓名';
comment on column workorder.age is '年龄';
-- 给表添加注释:
comment on table workorder is '员工订单';
------------------------------------------mysql ----------------------------
1.将同一个表中的一个字段create_time的值复制给另一个字段signed_time
UPDATE t_user SET signed_time = create_time
2.将同一个表中两个类型一样的字段的值互换
UPDATE t_user u1, t_user u2
SET u1.signed_time = u2.create_time,
u2.create_time = u1.signed_time
3.不同表一列复制到另一个列
update table1,table2 set table1.field1=table2.field2 where table1.id=table2.id
修改数栖平台mysql库字段内容:
select * from asset_service.bas_table where table_name='dwd_sf_pa_jobchangesnew_sdt';
update asset_service.bas_table set table_cn_name='PA_员工岗位异动报表' where id='296490';
UPDATE asset_service.bas_table SET table_cn_name = descr where id='296490'; ------ 建议使用此句
UPDATE asset_service.bas_table SET table_cn_name = descr where table_name like '%ods%'
--------------------------------
SELECT id, table_name, table_cn_name, create_time, data_mtime, descr, ctime, mtime, invalid
FROM asset_service.bas_table
where storage_name='集团财务数据_hive93';
update asset_service.bas_table set table_cn_name = descr where table_name = 'ods_financial_sapfs_producecost_smi';
UPDATE asset_service.bas_table SET data_mtime = create_time where storage_name='集团财务数据_hive93';
标签:count,set,name,笔记,hive,table,凑合,select 来源: https://blog.csdn.net/u011521584/article/details/104646882