hive中注意事项

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("[email protected]");
        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时,最好先退出当前会话再进入;

你可能感兴趣的:(hive)