Monthly Archives: January 2013

关于hive中not like的语法错误

hive的低版本中不支持not like的语法,在执行类似如下语句时会报错

create table ljp as
select gmt_created, first_user_name, servicer_name
from bds_c04_s_ocs_sessions
where first_user_name not like ‘游客%’;

错误信息如下:

FAILED: Parse Error: line 16:4 cannot recognize input near ‘first_user_name’ ‘not’ ‘like’ in expression specification

解决方案有两种:
一、修改语句,将not放在表达式前面,即改为这样:not (a like ‘B%’)
二、或升级hive版本,如在hive 1.1.7版本中,即可兼容not like语法。其他如not in等语句,也类似。详见社区的issue:https://issues.apache.org/jira/browse/HIVE-1740

END


Data Warehouse For Ever原创文章,转载请注明出处

ImportError: No module named bz2的解决方案

make时出现类似错误:ImportError: No module named bz2
多半是由于python的版本问题,新安装的python版本与系统自带的版本路径冲突,导致代码在import bz2模块时找不到路径。
在GOOGLE后,本人认为最好的解决方案是通过临时改变PATH路径的方式解决:
export PATH=/usr/bin:$PATH
make


Data Warehouse For Ever原创文章,转载请注明出处

Oracle中关于星期(IW和WW)的算法

Oracle中对于星期的计算规则中,其中关于计算本周是一年的第几周,有两种格式,IW和WW,其中的区别官方文档解释如下:

  • IW:基于 ISO标准计算出来的该年的第几周(1-52 or 1-53) 。
  • WW:该年的第几周(1-53),其中第1周指该年的第1天至第7天。
  • 从文档中可以看出,WW的算法是: int(dayOfYear+6)/7,个人觉得这种算法有点“2”。相信一般情况下,我们不会使用WW的吧,应该IW使用的比较多。
    关于Oracle提到的这个星期的计算ISO标准,是这样的:

  • 每个星期总是从周一开始,周日结束。
  • 如果1月1日是周五、周六或周日,则这一周算为上一年的最后一周,因为这周的大部分时间属于上一年。
  • 如果1月1日是周一、周二、周三或周四,则这一周算为新年的第一周,因为这周的大部分时间属于新的一年。
  • 下面这两张表格,是从Oracle官方文档中截取出来的:

    Table 3-7 First ISO Week of the Year: Example 1, January 1998

    Mo Tu We Th Fr Sa Su ISO Week
    - - - 1 2 3 4 First ISO week of 1998
    5 6 7 8 9 10 11 Second ISO week of 1998
    12 13 14 15 16 17 18 Third ISO week of 1998
    19 20 21 22 23 24 25 Fourth ISO week of 1998
    26 27 28 29 30 31 - Fifth ISO week of 1998

    Table 3-8 First ISO Week of the Year: Example 2, January 1999

    Mo Tu We Th Fr Sa Su ISO Week
    - - - - 1 2 3 Fifty-third ISO week of 1998
    4 5 6 7 8 9 10 First ISO week of 1999
    11 12 13 14 15 16 17 Second ISO week of 1999
    18 19 20 21 22 23 24 Third ISO week of 1999
    25 26 27 28 29 30 31 Fourth ISO week of 1999

    从表中可以看出,按照ISO标准算法,同样是1月1日,1998年是算第一周,而1999年的1月1日却算为上一年的最后一周。

    这里需要注意的是,ISO标准中星期的第一天是周一,而Oracle中其他一些日期处理算法中(如D),默认每周的第一天是周日。因为第一天是周日还是周一,由参数NLS_TERRITORY决定,而该参数的默认值是从NLS_LANG继承过来的,NLS_LANG默认值为AMERICA,因此默认周日是每周的第一天)。
    我们很多人认为中国人每周第一天从周一开始,其实不是这样哦,从Oracle上可以看出来,其实我国的每周第一天仍然是周日,与美国一致,只有德国、法国等一些欧洲国家是从周一开始的:

    SQL> select to_char(sysdate,’yyyymmdd’) from dual;

    TO_CHAR(
    ——–
    20110901

    SQL> ALTER SESSION SET NLS_TERRITORY=AMERICA;

    Session altered.

    SQL> select to_char(sysdate,’d') from dual;

    T
    -
    5

    SQL> ALTER SESSION SET NLS_TERRITORY=China;

    Session altered.

    SQL> select to_char(sysdate,’d') from dual;

    T
    -
    5

    SQL> ALTER SESSION SET NLS_TERRITORY=GERMANY;

    Session altered.

    SQL> select to_char(sysdate,’d') from dual;

    T
    -
    4


    Data Warehouse For Ever原创文章,转载请注明出处