zoukankan      html  css  js  c++  java
  • HiveQ与传统SQL差异

    1.   hive内连接支持什么格式?

    • SQL中对两表内联可以写成:
           select * from dual a,dual b where a.key = b.key;

           或者:

           SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2 WHERE t1.a2 = t2.b2
    • Hive中应为
           select * from dual a join dual b on a.key = b.key;

    2.   分号符号的使用

    • 分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:

             select concat(key,concat(';',key)) from dual;

    • 但HiveQL在解析语句时提示:
            FAILED: Parse Error: line 0:-1 mismatched input '<EOF>' expecting ) in function specification

    解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:

             select concat(key,concat('73',key)) from dual;

    3.   is [not] null的使用

    • SQL中null代表空值.

    • 在HiveQL中String类型的字段若是空(empty)字符串, 即长度为0, 那么对它进行IS NULL的判断结果是False.

    4.   Hive不支持使用insert语句将现有数据插入现有表或分区中

    •  Insert仅支持覆盖重写整个表或分区的操作,例如:

           INSERT OVERWRITE TABLE t1 SELECT * FROM t2;

    • 使用load语句插入新数据。

    5.   Hive不支持Insert into表values(),Update,Delete操作

    因为数据时存储在hdfs中,所以不支持这些操作,同时hive就不需要很复杂的锁机制来读写数据。

    6.   hive支持嵌入mapreduce程序,来处理复杂逻辑

    • 例如:

    FROM ( 

             MAP doctext USING 'python wc_mapper.py' AS (word, cnt) 

             FROM docs 

             CLUSTER BY word 

    ) a 

    REDUCE word, cnt USING 'python wc_reduce.py'; 

    --doctext: 是输入
    --word, cnt: 是map程序的输出
    --CLUSTER BY: 将wordhash后,又作为reduce程序的输入

    • 并且map程序、reduce程序可以单独使用,如:

    FROM ( 

             FROM session_table 

             SELECT sessionid, tstamp, data 

             DISTRIBUTE BY sessionid SORT BY tstamp 

    ) a 

    REDUCE sessionid, tstamp, data USING 'session_reducer.sh'; 

    7.   hive支持将转换后的数据直接写入不同的表,还能写入分区,hdfs,和本地目录

    • FROM t1 

             INSERT OVERWRITE TABLE t2 

             SELECT t3.c2, count(1) 

             FROM t3 

             WHERE t3.c1 <= 20 

             GROUP BY t3.c2 

     

    • INSERT OVERWRITE DIRECTORY '/output_dir' 

             SELECT t3.c2, avg(t3.c1) 

             FROM t3 

             WHERE t3.c1 > 20 AND t3.c1 <= 30 

             GROUP BY t3.c2 

     

    • INSERT OVERWRITE LOCAL DIRECTORY '/home/dir' 

             SELECT t3.c2, sum(t3.c1) 

             FROM t3 

             WHERE t3.c1 > 30 

             GROUP BY t3.c2;  FROM t1 

  • 相关阅读:
    线程的中断.interrupt
    线程的加入.join()
    Runnable接口
    线程Thread类
    求和、均值
    最值、对应索引位置
    数组、冒泡排序
    获取Methods成员方法类
    获取Field成员变量类
    基于WinDbg的内存泄漏分析
  • 原文地址:https://www.cnblogs.com/HondaHsu/p/4511854.html
Copyright © 2011-2022 走看看