`
flyingdutchman
  • 浏览: 353395 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

深入学习《Programing Hive》:HiveQL查询(3)

    博客分类:
  • Hive
阅读更多
        DISTRIBUTE BY
        我们都知道,MapReduce模型是默认是通过hashPartitioner()函数将key/value的keys的hash值来数据分发到对应的Reducers,DISTRIBUTE BY可以让用户来控制如何将key/value对分发到哪个Reducer。
        这在大多数的情况下通常很有用。但是在默写情况下,用户可能需要有自己来决定按某一个字段来将数据分发到Reducers,如下所示:
              hive> SELECT s.ymd,s.symbol,s.price_close  FROM stocks s
                  > DISTRIBUTE BY s.symbol
                  > SORT BY s.symbol ASC,s.ymd ASC;
        

        需要注意的是,DISTRIBUTE BY通常要和SORT BY使用,并且DISTRIBUTE BY必须使用在SORT BY之前。

        CLUSTER BY
        在上个使用DISTRIBUTE BY的示例中,由DISTRIBUTE BY按s.symbol字段将数据分发到相应的Reducers,然后又SORT BY对Reducer最终输出的数据按s.symbol和s.ymd做升序排序。
        CLUSTER BY关键字可以起到DISTRIBUTE BY和SORT BY相同的功能:
              hive> SELECT s.ymd,s.symbol,s.price_close  FROM stocks s
                  > CLUSTER BY s.symbol;
        

        使用DISTRIBUTE BYCLUSTER BY都可以起到对Reducers的输出做并行排倒序。

        类型转化(Casting)
        之前我们已经学习过数据类型转化的示例,如将一个数值转化为FLOAT类型,转换语法为cast(value AS TYPE),比如:
              SELECT name,salary FROM employees
              WHERE cast(salary AS FLOAT) < 100000.0
        

        如果salary不能转换成FLOAT类型的值的话,Hive会返回NULL。

        转换二进制类型的值
        从Hive 0.80开始,Hive开始支持二进制类型的值的转换。将BINARY的值b转换成STRING:
              SELECT (2.0 * cast(cast(b AS STRING) AS DOUBLE)) FROM src;
        

        同样也可以讲STRING类型转换成BINARY类型。

        采样查询
        有些时候,用户并不想对一个大数据集的数据做全部的分析处理,对于这种情况,Hive提供了对bucket table的采样查询功能:
              hive> SELECT * FROM numbers TABLESAMPLE(BUCKET 1 OUT OF 2 ON number)s;
        

        Hive中的桶下标是从1开始的。

        Block数据块数据采样(Block Sampling)
        Hive还提供了另外一种采样的语法——Block数据块数据采样,用户可以一个数据块的数据行(rows)采样:
              hive> SELECT * FROM numbersflat TABLESAMPLE(0.1 PERCENT) s;
        


        UNION ALL
        UNION ALL可以将两个或多个子查询的结果集合并到一块儿,这就要就要合并的结果集必须要有相同的列数,并且相对应的列要有相匹配的类型:
              SELECT log.ymd,log.level,log.message
                FROM(
                    SELECT l1.ymd,l1.level,l1.message,'log1' AS source FROM log1 l1
                  UNION ALL
                    SELECT l2.ymd,l3.level,l2.message,'log2' AS source FROM log2 l2
              ) log
              SORT BY log.ymd ASC
        
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics