hive中不能直接访问非group by 的字段
注意: 如果出现 Expression not in GROUP BY key 可以使用 collect_set()返回array数组**。
任何时候,考虑是不是要用distinct
注意 : 在检索数据时,尤其是在JOIN,count(*)时,要多考虑要不要去重,有时如果忽略掉distinct会造成引发大量MR。
hive中NULL 和 “”
以前一个案例,引发的思考
表结构:
a int
b string
c int
d string
数据:
\N,\N
\N,
,\N
,,
,,,
执行select返回结果
a(int) | b(string) | c(int) | d(string) |
---|---|---|---|
NULL | NULL | NULL | NULL |
NULL | NULL | NULL | |
NULL | NULL | NULL | NULL |
NULL | NULL | NULL | |
NULL | NULL |
总结 : int 类型,只要不能成功转换,必然返回NULL;string类型,如果指定为NULL或者没有预值位置(数据前三行d字段),均为NULL,否则”“
原因: hive是java编写的,int类型底层可能是Integer,所以不存在为NULL,转换失败为NULL,而string为了区分是否提供过值(预留空位),有三种状态:NULL,”“,value。具体需要意会下,不易表述。
载入数据时,最大限度确保数据格式的正确性
经验来自 :分析汽车销售
分析汽车销售时,源数据为xls,在转换csv时,直接将数据拿去用了 但是,在深度分析数据时,发现在转换过程中,有数据有偏差,原本以行的数据,在分割完成后,出现两行数据。
一行数据,但是数据中间出现^M导致变成两行数据。
进一步察看,发现是在转换数据的时候出现问题:
源数据:
转换后数据:
hive中查询数据行数:
总结 数据每一轮转换时,尽量要验证数据正确性,尽最大降低误差率。好别扭,应该是转码过程共,汉字组成^M了。
内置函数regexp_extract(STRING subject,STRING regex_pattern,STRING index)
此方法和java 中的正则匹配类似,分析一个java代码.
Pattern p = Pattern.compile("([a-zA-Z]*)@([a-zA-Z]*.[a-zA-Z]*)");
Matcher m = p.matcher("yourname@gmail.com");
if (m.matches()) {
email = m.group(0);
user = m.group(1);
hostname = m.group(2);
}
很清楚了,后面的index为第几个子表达式
注:正则中 (pattern) 是匹配 pattern 并捕获该匹配的子表达式
UDF注意问题
add jar 时,将jar包加载到当前terminal会话内存中,当退出后,从内存销毁;
create temporary function 也是存在当前会话内存中,会随会话销毁.
create function 是将结构村到mysql中
调试 UDF时,最好先退出当前会话再进入;