songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long
guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao
yang_beijing
注意:MAP,STRUCT 和 ARRAY 里的元素间关系都可以用同一个字符表示,这里用“_”。
3)Hive 上创建测试表 test
create table test(
name string,
friends array,
children map,
address struct
)
row format delimited
fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
字段解释: row format delimited fields terminated by ',' -- 列分隔符 collection items terminated by '_' --MAP STRUCT 和 ARRAY 的>>分隔符(数据分割符号) map keys terminated by ':' -- MAP 中的 key 与 value 的分隔符 lines terminated by '\n'; -- 行分隔符 row format serde 'org.apache.hadoop.hive.serde2.JsonSerDe'; -- 已经封装完成的序列化和反序列化数据格式;如JsonSerDe,可以按json格式进行切割并将对应key的value值匹配到对应的字段上。
4)导入文本数据到测试表 hive (default)> load data local inpath "/opt/module/datas/test.txt" into table test; 5)访问三种集合列里的数据,以下分别是 ARRAY,MAP,STRUCT 的访问方式
hive (default)> select friends[1],children['xiao
song'],address.city from test
where name="songsong";
OK
_c0 _c1 city
lili 18 beijing
Time taken: 0.076 seconds, Fetched: 1 row(s)
案例实操2:将多个字段转化为一个ARRAY>字段 建表
DROP TABLE IF EXISTS dim_sku_full;
CREATE EXTERNAL TABLE dim_sku_full
(
`id` STRING COMMENT 'sku_id',
......
`sku_attr_values` ARRAY> COMMENT '平台属性',
`sku_sale_attr_values` ARRAY> COMMENT '销售属性'
) COMMENT '商品维度表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dim/dim_sku_full/'
TBLPROPERTIES ('orc.compress' = 'snappy');
插入数据
INSERT OVERWRITE TABLE dim_sku_full
SELECT id,
......
attr as
(
select
sku_id,
collect_set(named_struct('attr_id',attr_id,'value_id',value_id,'attr_name',attr_name,'value_name',value_name)) attrs
from ods_sku_attr_value_full
where dt='2020-06-14'
group by sku_id
),
sale_attr as
(
select
sku_id,
collect_set(named_struct('sale_attr_id',sale_attr_id,'sale_attr_value_id',sale_attr_value_id,'sale_attr_name',sale_attr_name,'sale_attr_value_name',sale_attr_value_name))
sale_attrs
from ods_sku_sale_attr_value_full
where dt='2020-06-14'
group by sku_id
)
FROM ......
案例实操3:将多个字段转化为一个Map字段
select id,
str_to_map(concat_ws(",",collect_set(concat_ws(':', key, value) )) , ',', ':' )
from tmp
group by id;
类型转化 Hive 的原子数据类型是可以进行隐式转换的,类似于 Java 的类型转换,例如某表达式使用 INT 类型,TINYINT 会自动转换为 INT 类型,但是 Hive 不会进行反向转化,例如,某表达式使用 TINYINT 类型,INT 不会自动转换为 TINYINT 类型,它会返回错误,除非使用 CAST 操作。
修改数据库 alter database db_hive set dbproperties('createtime'='20170830'); 删除空数据库 drop database [IF NOT EXISTS] db_hive; 数据库不为空,强制删除数据库 drop database db_hive cascade;
查看建表语句 show create table fineDB.u8_so_order;
2.2.2 表操作
查看表 show tables; 创建表
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] `指定表在HDFS上的存储位置`
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement]
`LIKE允许用户复制现有的表结构,但是不复制数据`
修改内部表为外部表 alter table xxx set tblproperties('external'='true') 修改外部表为内部表 alter table xxx set tblproperties('external'='false')
增加单个分区 alter table ods_q6_log add partition(dt='2020-06-15'); 增加多个分区 alter table ods_q6_log add partition(dt='2020-06-15') partition(dt='2020-06-16'); 删除单个分区 alter table ods_q6_log drop if exists partition(dt='2020-06-15'); 删除多个分区 alter table ods_q6_log drop if exists partition(dt='2020-06-15'), partition(dt='2020-06-16');
# 创建二级分区表
create table dept_partition2(
deptno int, dname string, loc string
)
partitioned by (month string, day string)
row format delimited fields terminated by '\t';
# 导入数据
load data local inpath '/opt/module/datas/dept.txt' into table default.dept_partition2 partition(month='201709', day='13');
2.3 DCL
2.4 DML
2.4.1 数据导入
向表中装载数据(Load)
# 创建student表, 并声明文件分隔符’\t’(hive默认的分隔符\001 )
hive> create table student(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
hive> load data local inpath '/opt/module/datas/student.txt' into table student partition(dt='xxxx');
①Insert 导出 导出到本地 insert overwrite local directory '/opt/module/datas/export/student1' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' select * from student; 导出到hdfs insert overwrite directory '/user/atguigu/student2' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' select * from student;
④Export 导出到 HDFS 上 export table default.student to '/user/hive/warehouse/export/student';
⑤Sqoop 导出 sqoop export xxx
2.4.3 一般操作
插入数据 insert into student values(1000,"ss");
清除表中数据(Truncate) truncate table student;
查询语句中创建表并加载数据(As Select) create table if not exists xxxx as select id, name from yyyy; 查询表记录并插入原表 insert into table xxxxx partition(dt='xxxx') select * from xxx; 查询表记录并覆盖回原表,实现表的更新 insert overwrite table xxxxx partition(dt='xxxx') select * from xxx;
2.5 DQL
查询语句
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY col_list]
[CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT number]
算术运算符 select sal+1 from emp; 注:包括+、-、*、/、%、&、|、^、~等运算符
常用函数 select count(*)/max(sal)/min(sal)/sum(sal)/avg(sal)/round(xxx,n) from emp;
比较运算符 select * from emp where sal RLIKE '[2]'; 注:包括=、<=> (如果都为null,返回true;如果任一为null,返回null)、<>/!= (任一为null返回null)、<、<=、>、>=、between and (包括两边边界)、is null、is not null、in、like(同mysql)、rlike/regexp(正则匹配)
正则匹配
REGEXP 语法: A REGEXP B 操作类型: strings 描述: 功能与RLIKE相同 例:select count(*) from olap_b_dw_hotelorder_f where create_date_wid not regexp '\\d{8}'
REGEXP_EXTRACT 语法: regexp_extract(string subject, string pattern, int index) 返回值: string 说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符 例:select regexp_extract('IloveYou','I(.*?)(You)',1) from test1 limit1;
REGEXP_REPLACE 语法: regexp_replace(string A, string B, string C) 返回值: string 说明:将字符串A中的符合Java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似Oracle中的regexp_replace函数。 例:select regexp_replace("IloveYou","You","") from test1 limit1;
分组
Group By 语句
select cata, tm, name, sum(pro_num),`grouping`(cata), `grouping`(tm),`grouping`(name)
from default.cube_test
group by cata, tm, name
order by cata, tm, name;
-- 得到
pc,hp,envy,2,0,0,0
pc,mac,M1,6,0,0,0
phone,iphone,8,8,0,0,0
phone,redmi,k30,5,0,0,0
phone,redmi,z1,3,0,0,0
Group By Rollup:生成的结果集显示了所选列中值的某一层次结构的聚合,例Group by ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后对(A)进行GROUP BY,最后对全表进行GROUP BY操作。
select cata, tm, name, sum(pro_num), sum(pro_num),`grouping`(cata), `grouping`(tm),`grouping`(name)
from default.cube_test
group by rollup (cata, tm, name)
order by cata, tm, name;
-- 得到
,,,24,24,1,1,1
pc,,,8,8,0,1,1
pc,hp,,2,2,0,0,1
pc,hp,envy,2,2,0,0,0
pc,mac,,6,6,0,0,1
pc,mac,M1,6,6,0,0,0
phone,,,16,16,0,1,1
phone,iphone,,8,8,0,0,1
phone,iphone,8,8,8,0,0,0
phone,redmi,,8,8,0,0,1
phone,redmi,k30,5,5,0,0,0
phone,redmi,z1,3,3,0,0,0
Group By Cube:对选择的维度的所有组合进行group by,例cube(a,b,c):(a,b,c),(a,b),(a,c),(b,c),(a),(b),(c),(全表)
# 设置 reduce 个数
set mapreduce.job.reduces=3;
# 根据部门编号降序查看员工信息(每个reduce中的部门编号是降序的,汇总后的结果是部分有序的)
select * from emp sort by empno desc
# 将查询结果导入到文件中,不同于上个命令结果是杂乱无章的,导出后有三个文件,保存了每个reduce的排序结果
insert overwrite local directory '/opt/module/datas/sortby-result' select * from emp sort by deptno desc;
分区排序(Distribute By) Distribute By:distribute by是控制在map端如何拆分数据给reduce端的;需要配合sort by使用,即对记录进行分区,在每个分区中进行排序。 注意,Hive 要求 DISTRIBUTE BY 语句要写在 SORT BY 语句之前。
# 设置 reduce 个数
set mapreduce.job.reduces=3;
# 先按照部门编号分区,再按照员工编号降序排序
insert overwrite local directory '/opt/module/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;
Cluster By 当 distribute by 和 sorts by 字段相同时,可以使用 cluster by 代替,但是排序只能是升序排序,不能指定排序规则为 ASC 或者 DESC。 即select * from emp cluster by deptno; 等价于select * from emp distribute by deptno sort by deptno; 注意:分区时,可能多个key会进入一个分区中,如可能 20 号和 30 号部门分到一个分区里面去。
分桶及抽样查询
分桶表数据存储 分区针对的是数据的存储路径;分桶针对的是数据文件。
# 设置属性
set hive.enforce.bucketing=true;
# 创建分桶表
create table stu_buck(id int, name string)
clustered by(id) into 4 buckets
row format delimited fields terminated by '\t';
# 查看表结构
desc formatted stu_buck;
# 导入数据
insert into table stu_buck select id, name from stu;
分桶抽样查询 对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结果。Hive 可以通过对表进行抽样来满足这个需求。 select * from stu_buck tablesample(bucket 1 out of 2 on id) 解释:table 总 bucket 数为 4,tablesample(bucket 1 out of 2),表示总共抽取(4/2=)2 个bucket 的数据,抽取第 1(x)个和第 3(x+y)个 bucket 的数据。 根据结果可知:Hive的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
三、函数
查看系统自带的函数,支持模糊查询和正则查询 show functions; show functions like '*row_number*'; 显示自带的函数的用法 desc function upper; 详细显示自带的函数的用法 desc function extended upper;
获取日期中的年/月/日/时/分/秒/周/季度 with dtime as (select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss') as dt) select year(dt), month(dt), day(dt), hour(dt), minute(dt), second(dt), weekofyear(dt) ,floor(substr(dt,6,2)/3.1)+1 from dtime;
select dept_id, sum(case sex when '男' then 1 else 0 end) male_count, sum(case sex when '女' then 1 else 0 end) female_count from emp_sex group by dept_id;
行转列
数据
将如上数据转化为如下结构
结果
select
t1.base,
concat_ws('|', collect_set(t1.name)) name
from
(select
name,
concat(constellation, ",", blood_type) base
from
person_info) t1
group by
t1.base;
-- 以'='分割kv对中的key和value,以'-'分隔每个kv对
str_to_map(
concat_ws(
'-', collect_list(
concat(
case
when year_month_day is not null
then 'year_month_day'
when year_week is not null
then 'year_week'
when year_month is not null
then 'year_month'
when year is not null then 'year'
end, '='
, nvl(sale_num, ''), ',', nvl(sale_amount, ''), ',', nvl(send_num, ''), ','
, nvl(stock_out, ''), ',', nvl(stock_unserved, '')
)
)
), '-', '='
)
列转行
LATERAL VIEW udtf(expression) tableAlias AS columnAlias。 EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行,默认分隔符为逗号。 将如下数据
数据
转化为如下结构
结果
select
movie,
category_name
from
movie_info lateral view explode(category) table_tmp as category_name;
如果窗口函数排序,那么就默认有一个rows between 最前行到当前行。 sum(cost) over(partition by name order by orderdate) 和下句表达的意思是一样的 sum(cost) over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row ) 即由起点到当前行的聚合。
如果窗口函数没有排序,那么默认从最前行到最后行. sum(cost) over() 和下句表达的意思是一样的 sum(cost) over(rows between unbounded preceding and current row)
partition by .. order by ..和group by ..order by .. 区别:partition by和order by的执行顺序是连着的,分区后进入不同的reduce以关键字为key进行排序,输出时同一分区在一起且各个分区内的数据有序。而group by和order by的执行顺序不是连着的,order by是对分组后的表进行的整表排序,进入一个reduce中,所以order by一般和limit连用。
min(dt) over (order by dt rows between unbounded preceding and 1 preceding) 中,首先会对全局dt进行排序,而非首行到前一行排序;最后选择首行到前一行作为窗口进行处理。
如下hql,如果ts中有两个值相同,那么运行语句中有无between unbounded preceding and current row得到的结果是不同的。推测没有时的逻辑是筛选出小于等于ts的记录作为窗口进行sum;而有between时,是排序后从第一行到当前行的记录作为窗口进行sum。
select id, ts, sum(p) over (order by ts rows between unbounded preceding and current row ) as online_num
from t1
SELECT get_json_object(line, '$.order_totalfee'),
get_json_object(item, '$.tid'),
get_json_object(item, '$.send_num')
FROM (
SELECT row_number() over (partition by get_json_object(line, '$.tid')) row_num,
line
FROM hxr_edb.ods_edb_order
where ds = '$edb_ds'
and get_json_object(line, '$.tid_item') is not null
) tmp
lateral view hxr_edb.explode_json_array(get_json_object(tmp.line, '$.tid_item')) table_tmp as item
where row_num = 1;
get_json_object函数
用于获取json字符串中的属性的值,参数是字段名和外部json名.json属性名。
insert overwrite table dwd_start_log
PARTITION (dt='2019-02-10')
select
get_json_object(line,'$.mid') mid_id,
get_json_object(line,'$.uid') user_id,
get_json_object(line,'$.vc') version_code
from ods_start_log
where dt='2019-02-10';
create function device_udf as 'com.cj.hive.TimeCountUDF ' using jar 'hdfs://bigdata1:9000/user/hive/jars/hivefunction-1.0-SNAPSHOT-jar-with-dependencies.jar';
create function addr_udtf as 'com.cj.hive.ModelJsonUDTF ' using jar 'hdfs://bigdata1:9000/user/hive/jars/hivefunction-1.0-SNAPSHOT-jar-with-dependencies.jar';
show functions like "*udtf*"; # 模糊匹配搜索函数
删除函数 drop [temporary] function [if exists] [dbname.]function_name;
小表join大表 如果是join on ,会将左表先加入内存,然后通过on条件,筛选右表的符合条件项,建立一张临时表,避免了如果使用where,会先产生笛卡尔积表,再进行筛选的危险。 map join优化: 如果是map join ,那么就要大表join小表(25MB)。因为MR底层会调用本地任务将join后面的表缓存到内存中,所以将小表放在后面可以减轻缓存和计算压力。如果是join,优化器会自动交换位置;如果是left join不会交换位置,需要注意大表join小表。 ①设置自动选择Mapjoin set hive.auto.convert.join = true; 默认为true ②大表小表的阈值设置(默认25M一下认为是小表) set hive.mapjoin.smalltable.filesize=25000000; reduce join 优化: 如果关闭了map join功能(默认是打开的) set hive.auto.convert.join = false; 或者没有小表(25MB以下),那么会进行reduce join。一般来说都是小表join大表,小表join大表,如果是内连接,hive会自动优化,将小表放在左边join大表,效率高。 但是如果是外连接,就需要将小表放在join左边,将大表放在join右边。
数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率。 set hive.auto.convert.join = true; 默认为true set hive.mapjoin.smalltable.filesize=25000000;大表小表的阈值设置(默认25M一下认为是小表) MapJoin把小表全部加载到内存在map端进行join,将join后的结果直接输出,避免reducer处理。
大表join大表 Join前先过滤表中的脏数据,如果某一个key对应的数据过多,可以进行加盐使其随机分不到不同reduce中。 例1:滤空 hive (default)> insert overwrite table jointable select n.* from (select * from nullidtable where id is not null ) n left join ori o on n.id = o.id; 例2:随机分布空null值 insert overwrite table jointable select n.* from nullidtable n full join ori o on case when n.id is null then concat('hive', rand()) else n.id end = o.id;
预聚合功能 group by会先通过key值分区,然后再通过key值再进行分组。如果某个分区有过多的数据,会进入一个reduce,则会造成某一个reduce数据量过大,即数据倾斜。可以开启预聚合功能:会先进行一个MR任务,该阶段随机进行分组,然后数据均匀的进入reduce处理,该步先将相同的key进行聚合,然后将得到的结果作为输入给到下一个MR任务,该任务将根据key进行分区,进入reduce输出最终的group by结果。 由于先进行了预分区,所以两次MR任务都不会出现严重的数据倾斜。 set hive.map.aggr = true 开启Map端聚合参数设置,默认为true set hive.groupby.mapaggr.checkinterval = 100000 在Map端进行聚合操作的条目数目 set hive.groupby.skewindata = true 有数据倾斜的时候进行负载均衡,默认为false
避免使用distinct distinct去重和group by 去重是一回事。但是count(distinct ..)是全聚合操作,最终会进入一个reduce中,造成效率低下。可以先用group by 过滤,然后在过滤表的基础上再进行count. select count(distinct id) from bigtable; 只进行一个MR任务,但是进入一个reduce中处理。 替换为 select count(id) from (select id from bigtable group by id) a; 两个MR任务处理,每个MR任务中多个reduce进行处理。 虽然会多用一个Job来完成,但在数据量大的情况下,这个绝对是值得的
避免笛卡尔积 where是单个表用的,如果多个表用where,会先产生笛卡尔积表再进行筛选,效率低且消耗内存。多表用join on 连接,会先进行on的筛选,不会产生笛卡尔积表。 尽量避免笛卡尔积,join的时候不加on条件,或者无效的on条件,Hive只能使用1个reducer来完成笛卡尔积。因为没有on条件,所有的数据都会进入一个reduce中,reduce压力过大,所以禁止笛卡尔积表生成。有on条件,相同的字段进入一个reduce,多reduce并行处理。 8.行列过滤: 列过滤:少用select * ,要什么就选什么 行过滤:在进行join之前将表进行过滤 select o.id from bigtable b join ori o on o.id = b.id where o.id <= 10; 替换为 select b.id from bigtable b join (select id from ori where id <= 10 ) o on b.id = o.id;
动态分区调整 关系型数据库中,对分区表Insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive中也提供了类似的机制,即动态分区(Dynamic Partition),只不过,使用Hive的动态分区,需要进行相应的配置。 1.开启动态分区参数设置 (1)开启动态分区功能(默认true,开启) hive.exec.dynamic.partition=true (2)设置为非严格模式(动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区。) hive.exec.dynamic.partition.mode=nonstrict (3)在所有执行MR的节点上,最大一共可以创建多少个动态分区。默认1000 hive.exec.max.dynamic.partitions=1000 (4)在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。 hive.exec.max.dynamic.partitions.pernode=100 (5)整个MR Job中,最大可以创建多少个HDFS文件。默认100000 hive.exec.max.created.files=100000 (6)当有空分区生成时,是否抛出异常。一般不需要设置。默认false hive.error.on.empty.partition=false 2.案例实操 需求:将dept表中的数据按照地区(loc字段),插入到目标表dept_partition的相应分区中。 (1)创建目标分区表 hive (default)> create table dept_partition(id int, name string) partitioned by (location int) row format delimited fields terminated by '\t'; (2)设置动态分区 set hive.exec.dynamic.partition.mode = nonstrict; hive (default)> insert into table dept_partition partition(location) select deptno, dname, loc from dept; (3)查看目标分区表的分区情况 hive (default)> show partitions dept_partition; 思考:目标分区表是如何匹配到分区字段的? 三个字段数据按顺序匹配。
1.配置配置文件 2.启动Hive时,可以在命令行添加-hiveconf param=value来设定参数 hive -hiveconf mapred.reduce.tasks=10; 3.hive (default)> set mapred.reduce.tasks=100;
不进入hive交互窗口执行hql语句 hive -e "select id from student;" 执行脚本中sql语句 hive -f /opt/module/datas/hivef.sql hive -f /opt/module/datas/hivef.sql > /opt/module/datas/hive_result.txt 在hive交互窗口中查看hdfs文件系统 dfs -ls /; 在hive交互窗口中查看本地文件系统 ! ls /opt/module/datas; 4.查看在hive中输入的所有历史命令 cat ~/.hivehistory
hive2.3配置
hive-env.sh
# Set HADOOP_HOME to point to a specific hadoop install directoryHADOOP_HOME=${HADOOP_HOME}
export HADOOP_HOME=$HADOOP_HOME
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=$HIVE_HOME/conf
# Folder containing extra libraries required for hive compilation/execution can be controlled by:
# export HIVE_AUX_JARS_PATH=
export TEZ_HOME=/opt/module/tez-0.9.1
export TEZ_JARS=""
for jar in `ls $TEZ_HOME | grep jar`;do
export TEZ_JARS=$TEZ_JARS:$TEZ_HOME/$jar
done
for jar in `ls $TEZ_HOME/lib`;do
export TEZ_JARS=$TEZ_JARS:$TEZ_HOME/lib/$jar
done
export HIVE_AUX_JARS_PATH=$HADOOP_HOME/share/hadoop/common/hadoop-lzo-0.4.20.jar$TEZ_JARS
hive-site.xml
javax.jdo.option.ConnectionURLjdbc:mysql://bigdata3:3306/metastore?createDatabaseIfNotExist=trueJDBC connect string for a JDBC metastorejavax.jdo.option.ConnectionDriverNamecom.mysql.jdbc.DriverDriver class name for a JDBC metastorejavax.jdo.option.ConnectionUserNamerootusername to use against metastore databasejavax.jdo.option.ConnectionPasswordhxrpassword to use against metastore databasehive.metastore.warehouse.dir/user/hive/warehouselocation of default database for the warehousehive.cli.print.headertruehive.cli.print.current.dbtruehive.metastore.schema.verificationfalsedatanucleus.schema.autoCreateAlltruehive.metastore.uristhrift://bigdata1:9083hive.execution.enginetez
-- 修改字段注释字符集
alter table COLUMNS_V2 modify column comment varchar(256) character set utf8;
-- 修改表注释字符集
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
-- 修改分区参数,支持分区键用中文表示
alter table PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
-- 修改索引名注释,支持中文表示
alter table INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
-- 修改视图,支持视图中文
ALTER TABLE TBLS modify COLUMN VIEW_EXPANDED_TEXT mediumtext CHARACTER SET utf8;
ALTER TABLE TBLS modify COLUMN VIEW_ORIGINAL_TEXT mediumtext CHARACTER SET utf8;
http://google.github.io/snappy/ On a single core of a Core i7 processor in 64-bit mode, Snappy compressesat about 250 MB/sec or more and decompresses at about 500 MB/sec or more.
在Hive on Spark的方式中,也是一样的,Spark作为分布式架构,通常会尝试从多个不同机器上一起读入数据。要实现这种情况,每个工作节点都必须能够找到一条新记录的开端,也就需要该文件可以进行分割,但是有些不可以分割的压缩格式的文件,必须要单个节点来读入所有数据,这就很容易产生性能瓶颈。(下一篇文章详细写Spark读取文件的源码分析)
hive在join时,会误把lzo索引当成小文件进行合并,并插入一条。 select * from ods_log不执行MR操作,直接采用的是ods_log建表语句中指定的DeprecatedLzoTextInputFormat,能够识别lzo.index为索引文件。 select count(*) from ods_log执行MR操作,会先经过hive.input.format,其默认值为CombineHiveInputFormat,其会先将索引文件当成小文件合并,将其当做普通文件处理。
解决:在对ods表进行降维等操作时,直接关闭hive自动合并小文件即可 set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a null object reference
出现以上异常.然后就在baidu上
cmd命令打jar是如下实现:
在运行里输入cmd,利用cmd命令进入到本地的工作盘符。(如我的是D盘下的文件有此路径 D:\workspace\prpall\WEB-INF\classes)
现在是想把D:\workspace\prpall\WEB-INF\classes路径下所有的文件打包成prpall.jar。然后继续如下操作:
cd D: 回车
cd workspace/prpal
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml&q
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
public class Solution {
public int maximalRectangle(char[][] matrix)
随着RESTful Web Service的流行,测试对外的Service是否满足期望也变的必要的。从Spring 3.2开始Spring了Spring Web测试框架,如果版本低于3.2,请使用spring-test-mvc项目(合并到spring3.2中了)。
Spring MVC测试框架提供了对服务器端和客户端(基于RestTemplate的客户端)提供了支持。
&nbs
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
/*you'll also need to set UIViewControllerBasedStatusBarAppearance to NO in the plist file if you use this method
英文资料:
Thread Dump and Concurrency Locks
Thread dumps are very useful for diagnosing synchronization related problems such as deadlocks on object monitors. Ctrl-\ on Solaris/Linux or Ctrl-B