HQL基本语法及应用案例

摘自:《大数据技术体系详解:原理、架构与实践》

一.HQL基本语法

  HQL是Hive提供的数据查询语言,由于Hive巨大的影响力,HQL已被越来越多的Hive On Hadoop系统所支持和兼容。HQL语法非常类似于SQL,目前包括以下几类语句:
    (1)DDL(Data Definition Language,数据定义语言)
        DDL主要涉及元数据的创建,删除及修改。Hive中元数据包括数据库,数据表,视图,索引,函数,用户角色和权限等,具体包括:
          数据库相关的DDL   :CREATE/DROP/ALTER/USE Database
          数据表相关的DDL   :CREATE/DROP/TRUNCATE TABLE 
          表/分区/列相关的DDL :ALTER TABLE/PARTITION/COLUMN
          索引相关的DDL    :CREATE/DROP/ALTER INDEX
          视图相关的DDL    :CREATE/DROP/ALTER VIRW
          函数相关的DDL   :CREATE/DROP/ALTER
          角色和权限相关的DDL :CREATE/DROP/GRANT/REVOKE ROLES AND PRIVILEGES 
        HQL的DDL语句的语法跟标准的SQL语法非常相似,为了简单起见,咱们主要介绍数据表的创建,删除和修改。
    (2)DML(Data Manipulation Language,数据操作语言)
        DML定义了数据操作语句,包括:
          数据控制语句,包括LOAD,INSERT,UPDATE和DELETE四类语句。
          数据检索语句,包括SELECT查询语句,窗口和分析函数等。
          存储过程,HIVE存储过程的实现源自于开源项目HPL/SQL。HPL/SQL项目的目标是为Hive,Spark SQL和Impala等SQL On Hadoop项目实现存储过程。
        HQL中的DML语句的语法跟标准SQL语法非常类似,我们主要介绍数据加载和SELECT查询语句。
    (3)锁
        Hive提供读写锁以避免数据访问一致性问题。

1>.HQL初体验

  某网站每天产生大量用户访问日志,为简化分析,假设每条访问日志由六个字段构成:访问时间,所在国家,用户编号,用户访问的网页链接,客户端上次请求的链接以及客户端IP,数据格式如下所示(每个字段用","分隔):
      1999/01/11 10:12,us,927,www.yahoo.com/clq,www.yahoo.com/jxq,948.323.252.617
      1999/01/12 10:12,de,856,www.google.com/g4,www.google.com/uypu,416.358.537.539
      1999/01/12 10:12,se,254,www.google.com/f5,www.yahoo.com/soeos,564.746.582.215
      1999/01/12 10:12,de,465,www.google.com/h5,www.yahoo.com/agvne,685.631.592.264
      1999/01/12 10:12,de,856,www.yinzhengjie.org.cn/g4,www.google.com/uypu,416.358.537.539
      ......
  请问,如何用Hive构建数据表并使用HQL分析这些访问日志(比如在某一时间段的浏览次数)?
[root@storage111 yinzhengjie]# cat PageViewData.csv              #查看本地文件日志,为了测试我就随机写了条数据
[root@storage111 yinzhengjie]# hdfs dfs -ls  /tmp/
Found 5 items
d--------- - hdfs supergroup 0 2019-05-20 10:48 /tmp/.cloudera_health_monitoring_canary_files
drwxr-xr-x - yarn supergroup 0 2018-10-19 15:00 /tmp/hadoop-yarn
drwx-wx-wx - root supergroup 0 2019-04-29 14:27 /tmp/hive
drwxrwxrwt - mapred hadoop 0 2019-02-26 16:46 /tmp/logs
drwxr-xr-x - mapred supergroup 0 2018-10-25 12:11 /tmp/mapred
[root@storage111 yinzhengjie]#
[root@storage111 yinzhengjie]#
[root@storage111 yinzhengjie]# ll
total 4
-rw-r--r-- 1 root root 1584 May 20 10:42 PageViewData.csv
[root@storage111 yinzhengjie]#
[root@storage111 yinzhengjie]# hdfs dfs -put PageViewData.csv /tmp/
[root@storage111 yinzhengjie]#
[root@storage111 yinzhengjie]# hdfs dfs -ls /tmp/
Found 6 items
d--------- - hdfs supergroup 0 2019-05-20 10:48 /tmp/.cloudera_health_monitoring_canary_files
-rw-r--r-- 3 root supergroup 1584 2019-05-20 10:49 /tmp/PageViewData.csv
drwxr-xr-x - yarn supergroup 0 2018-10-19 15:00 /tmp/hadoop-yarn
drwx-wx-wx - root supergroup 0 2019-04-29 14:27 /tmp/hive
drwxrwxrwt - mapred hadoop 0 2019-02-26 16:46 /tmp/logs
drwxr-xr-x - mapred supergroup 0 2018-10-25 12:11 /tmp/mapred
[root@storage111 yinzhengjie]#
[root@storage111 yinzhengjie]#

[root@storage111 yinzhengjie]# hdfs dfs -put PageViewData.csv /tmp/     #将数据上传到HDFS的/tmp目录中

    使用HIVE解决该问题可分为三个阶段:
阶段1:创建数据表page_view,以保证结构化用户访问日志:     hive> CREATE TABLE page_view(
    > view_time String,
     > country String,
     > userid String,
     > page_url String,
     > referrer_url String,
     > ip String)
     > ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED by '\n'
     > STORED AS TEXTFILE;
    OK
    Time taken: 0.617 seconds
    hive>
    创建Hive数据表时,需显式指定数据存储格式,在以上示例中,TEXTFILE表示文本文件,“,”表示每列分隔符为逗号,而“\n”表示分隔符。   阶段2:加载数据。
    使用LOAD语句将HDFS上的指定目录或文件加载到数据表page_view中:
      hive> LOAD DATA INPATH "/tmp/PageViewData.csv" INTO TABLE page_view;
      Loading data to table test.page_view
      Table test.page_view stats: [numFiles=1, totalSize=1584]
      OK
      Time taken: 0.71 seconds
      hive>
    
  阶段3:使用HQL查询数据。
    使用类SQL语言生成统计报表,比如“统计某个时间点后来自每个国家的总体访问次数。”
      hive> SELECT country,count(userid) FROM page_view WHERE view_time > "1990/01/12 10:12" GROUP BY country;
hive> SELECT country,count(userid) FROM page_view WHERE view_time > "1990/01/12 10:12" GROUP BY country;
Query ID = root_20190520105454_352faf00-c601-4146-be07-14f7db34e311
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Starting Job = job_1552552068924_7036, Tracking URL = http://storage101.aggrx:8088/proxy/application_1552552068924_7036/
Kill Command = /opt/cloudera/parcels/CDH-5.15.1-1.cdh5.15.1.p0.4/lib/hadoop/bin/hadoop job -kill job_1552552068924_7036
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2019-05-20 10:55:11,599 Stage-1 map = 0%, reduce = 0%
2019-05-20 10:55:21,001 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 3.83 sec
2019-05-20 10:55:27,300 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 7.49 sec
MapReduce Total cumulative CPU time: 7 seconds 490 msec
Ended Job = job_1552552068924_7036
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 7.49 sec HDFS Read: 10512 HDFS Write: 21 SUCCESS
Total MapReduce CPU Time Spent: 7 seconds 490 msec
OK
cn 1
de 11
se 4
us 4
Time taken: 30.736 seconds, Fetched: 4 row(s)
hive>

hive> SELECT country,count(userid) FROM page_view WHERE view_time > "1990/01/12 10:12" GROUP BY country;

2>.数据表的创建,删除和修改

    不同于关系型数据库中的数据表,Hive具有以下特点:
    (1)元数据和数据是分离的,元信息保存在Metastore中,数据则保存在分布式文件系统中。
    (2)自定义文件格式,Hive中存储数据的文件格式是用户自定义的,目前支持文本文件,Sequence File,Avro,ORC和Parquet等数据格式。
    (3)运行时数据合法性检查,关系型数据库中的数据是插入时进行合法性检查的,而Hive中的数据则是(HQL翻译成的)分布式应用程序运行时进行数据合法性检查的。

    (1)Hive数据表的创建
      Hive数据表是多层级的,如上图所示,Hive中可以有多个数据库,每个数据库中可以存在多个数据表,每个数据表可进一步划分为多个分区或者数据桶,每个分区内部也可以有多个数据桶。
      Hive创建表的语法定义如下(经简化):
        CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
          [(cole_name data_type [COMMENT col_comment],...)]
          [PARTITIONED BY (col_name data_type [COMMENT col_comment],...)]
          [CLUSTERED BY (col_name,col_name,...) INTO num_buckets BUCKETS]
          [
            [ROW FORMAT row_format]
            [STORED AS file_format]
          ]
          [LOCATION hdfs_path]
          [TBLPROPERTIES (perperty_name=property_value,...)]
          [AS select_statement];
      接下来,按照数据表语法定义顺序,依次解析各个关键字的含义:
        1)数据表的类别。Hive数据表分为三类:临时表(TEMPORARY TABLE),外部表(EXTERNAL TABLE)和受管理表(MANAGED TABLE),其分区如下:
            临时表 : 仅对当前session可见,一旦session退出,该数据表将自动被删除。
            外部表 : 外部表的数据存储路径是用户定义的而非Hive默认存储位置,外部表被删除后,其对应的数据不会被清除(仅删除元数据)。
            受管理表 : 默认是数据表的类型,这种表的数据是受Hive管理的,与元数据的生命周期是一致的。
        2)数据类型(data_type)。Hive提供了丰富的数据类型,它不仅提供类似于关系型数据库中的基本数据类型,也提供了对高级数据类型(包括数据,映射表,结构体和联合体)的支持,具体包括:
            基本数据类型   : TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,DOUBLE PRECISON,STRING,BINARY,TIMESTAMP,DECIMAL,DATA,VARCHAR和CHAR的美好。
            数组(array)  : 类似于Java中的映射表,由Key/value映射对组成的集合,key是value的索引。
            结构体(struct): 类似于C语言中的结构体,由一系列具有想用类型或不同类型的数据构成的数据集合。
            联合体(union) : 类似于C语言中的联合体,与结构体类似,但它将几种相同或不同类型的变量存放到同一段内存单元中。
        3)分区表和分桶表。为了加速数据处理,数据表可进一步划分成更小的存储单位,即分区或分桶。
            分区表 : 数据表可以按照某一个或几个字段进一步划分成多个数据分区(使用语句“PARTITIONED BY col_name”),不同分区的数据将被存放在不同目录中。这样,当一个查询语句只需要用到里面的若干个分区时,其他分区则可直接跳过扫描,大大节省了不必要的磁盘IO。
            分桶表 : 数据表或数据分区可进一步按照某个字段分成若干个桶,比如语句“CLUSTERED BY(userid)INTO 32 BUCKETS"可讲数据按照userid这一字段分成32个桶,实际是按照公式"hash_function(bucketing_column) mod num_buckets"计算得到具体桶编号的,其中hash_function与具体的数据类型有关。分桶表对倾斜数据表(某一列或几列中某些数据值出现次数非常多)分析,数据采样和多表链接(尤其是map side join)等场景有特殊优化。
        4)行格式(row format)。该配置用于指定每行的数据格式,仅对行式存储格式有意义,其语法如下:
              DELIMITED [FIELDS TEMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] [NULL DEFINED AS char]
              | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value,property_name=property_value,...)]
            在创建数据表时,DELIMITED和SERDE两种配置最多设置一个(可以不设置)。几个关键字含义如下:
              FIELDS TERMINATED BY char        : 每行中不同字段的分隔符char。
              COLLECTION ITEMS TERMINATED BY char  : map,sturct或array中每个元素之间的分隔符char。
              MAP KEYS TERMINATED BY char       : map中key和value之间的分隔符char。
              LINES TERMINATED BY char         : 行分隔符char。
            举个例子,我们创建一个person的数据表,由name(姓名)和score(课程成绩)两个字段构成,其中source数据类型为map,key为课程名,value是得分。
              CREATE TABLE person(name STRING,score map<STRING,INT>)
              ROW FORMAT DELIMITED
              FIELDS TERMINATED BY '\t'
              COLLECTION ITEMS TERMINATED BY ','
              MAP KEYS TERMINATED BY ':';
            对应的数据存储方式为:
              Tom  'Math':80,'Chinese':90,'English':95  
              Bob  'Chinese':60,'Math':80,'English':99
            SERDE关键字允许用户通过定制化和反序列化规定数据存储格式,比如:JSON格式和CSV格式。
        5)数据格式(file format)。HIVE支持多种数据存储格式,包括:
            TEXTFILE    : 文本文件,这是默认文件存储格式,用户可通过"hive.default.fileformat"修改默认值,可选值为:TextFILE,SequenceFile,RCfile或ORC。
            SEQUENCEFILE  : 二进制存储格式SequenceFile;
            RCFILE     : 列式存储格式;
            ORC       : 优化的列式存储格式;
            PARQUET    : 列式存储格式;
            AVRO      : 带数据模式的存储格式;
            INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname :通过自定义InputFormat和OutputFormat两个组件定义数据格式。
        6)数据存放位置(HDFS path)。每个数据表对应的数据将被存在一个单独目录中,具体由参数"hive.metastore.warehouse.dir"指定,默认是"/usr/hive/warehouse/<databasename>.db/<tablenae>/,"比如数据库school中的表student存放路径则为:"/user/hive/warehouse/school.db/student/"中。
        7)表属性。Hive允许用户为数据表增加任意表属性,每个表属性以“key/value”的形式存在,Hive也预定了一些表属性,比如:
            TBLPROPERTIES("hbase.table.name"="table_name") : 用于Hive与HBase集成,表示该Hive表对应的HBase表的table_name;
            TBLPROPERTIES("orc.compress"="ZLIB")  : 用于标注ORC表的压缩格式,ZLIB为压缩算法。
    (2)Hive数据表的删除于修改
      Hive提供了两种删除数据表的语法:
        DROP TABLE,语法如下:
          DROP TABLE [IF EXISTS] table_name [PUTCE];
        删除指定数据表的数据和元信息,其中数据将被移动到垃圾箱,除非设置了“PURGE”标志,则跳过垃圾箱直接永久清除。需要注意的是,如果指定了数据表是外表,则仅会清理元信息。
        TRUNCATE TABLE,语法如下:
          TRUNCATE TABLE table_name [PATTITION partition_spec];
        数据指定数据表的全部数据或某个分区,默认情况下,删除的数据将被移动到垃圾箱。

3>. 数据的查询语句

    HQL数据查询语句的语法和标准SQL非常类似,具体如下:
      [WITH CommonTableExpression (,CommonTableExpression)*]
      SELECT [ALL | DISTINCT] select_expr,select_expr,...
        FROM table_eference
        [WHERE where_condition]
        [GROUP BY col_list]
        [ORDER BY col_list]  
        [CLUSTER BY col_list
          | [DISTRIBUTE BY col_list] [SORT BY col_list]
        ]
      [LIMIT number]
  接下来说明几处与标准SQL不同之处:
    (1)WHIH CommonTableExpression (,CommonTableExpresson):Hive提供了一种将子查询作为一个数据表的语法,叫做Common Table Expression(CTE),比如从表t中选出两种类型的数据,并合并在一起为输出:
        with t1 as (select * from t where key = '5'),
        t2 as (select * from t where key = '4')
        select * from t1 union all select * from t2;
     
    (2)ORDER BY 和SORT BY:ORDER BY和SORT BY两个语句均是数据表和数据按照指定的排序键进行排序,但排序方式稍有不同,具体需从底层计算引擎MapReduce角度理解。ORDER BY用于全局排序,就是对指定的所有排序键进行全局排序,使用ORDER BY的查询语句,最后会有一个Reduce Task来完成全局排序(即只会启动一个Reduce Task);SORT By用于分区内排序,即每个Reduce任务内部排序(即最终启动多个Reduce Task并行排序)。 
    (3)DISTRIBUTE BY 和CLUSTER BY:DISTRIBUTE BY语句能按照指定的字段或表达式对数据进行划分,输出到对应的Reduce Task或者文件中。CLUSTER BY等价于DISTERIBUTE BY与SORT BY组合,比如以下两条HQL语句等价。
          SELECT col1,col2 FROM t1 CLUSTER BY col1;
          SELECT col1,col2 FROM t1 DISTRIBUTE BY coll SORT BY coll;
       当数据量特别大,需要对最终结果进行排序时,建议采用DISTRIBUTE BY结合SORT BY语句,比如统计每个url对应的用户行为日志,并按照时间结果排序,如果采用DISTRIBUTE + SORT BY方式,HQL语句如下:
          set mapreduce.job.reduces=2  #设置reduce task数目为1
          SELECT url_id,log_time,log_type FROM behavior DISTRIBUTE BY url_id SORT BY user_id,log_time;
        如果采用“ORDER BY”,HQL语句如下:
          SELECT url_id,log_time,log_type FORM behavior ORDER BY user_id,log_time;
        以上两种方式最终结果如下图所示:

二.HQL应用案例  

    为了方便大家更系统的了解HQL的使用方式,这里将给出一个综合案例-汪涵的用户访问日志分析系统。背景如下:某个网站每天产生大量用户访问行为数据,这些行为数据包含的字段与我们前面描述的一直,如何使用Hive构建一个数据仓库洗,能够从国家和时间(天,月和年为时间粒度)两个纬度产生网站的pv,uv等报表数据。

为了提高数据处理效率,我们采用了分区表和列式存储两种优化技巧:
分区表:以国家和时间(以天为单位)两个纬度创建分区表,这样,当统计某个国家或时间端内数据时,只需要扫描对应分区中的数据(忽略索引),大大提高性能。
列式存储:考虑到绝大部分情况下,HQL语句只会用到若干列数据,为了避免不必要的磁盘IO,我们采用列式存储格式存储数据,比如ORC或Parquet。

构建用户访问日志分析系统的主要流程如下图所示:

  

    (1)ETL(Extract Transform Load)。用户描述将数据从来源端经过抽取(extract),转化(transform),加载(load)至目的端的过程。其中抽取主要功能是从原始文本解析处需要的数据,并对不合要求的数据进行清洗和转换,包括:
   不符合要求的数据是完整的数据,错误的数据,重复的数据。
   不一致的数据,数据粒度的转换,以及一些商务规划的计算。
      在实例中,原始日志数据经抽取和转换(可选用Python语言,使用Hadoop Streaming实现)后,变为以下结构化数据:
          1999/01/12 10:12,se,254,www.google.com/f5,www.yahoo.com/soeos,564.746.582.215
          1999/01/12 10:12,de,465,www.google.com/h5,www.yahoo.com/agvne,685.631.592.264
      ......
      之后加载到数据表page_view中,该数据表的创建方式我们上面以及做过介绍了,这里不再赘述。
      每天产生的原始数据行为数据经ETL后,以"PageViewData_<date>.csv"(<date>表示当前的日期)命名方式存到/tmp目录下,并通过以下DML语句加载到数据表page_view(以文本文件作为的存储格式)中:
          LOAD DATA INPATH "/tem/PageViewData_19990112.csv" INTO TABLE page_view;   (2)创建ORC分区表,并加载数据。为了加快数据处理速度,我们以国家和和时间(以天为单位)两个度量创建ORC分区表orc_page_view,对应的DDL语句如下所示:
        hive> CREATE TABLE orc_page_view(
        > view_time STRING,
        > userid STRING,
        > page_url STRING,
        > referrer_url STRING,
        > ip STRING)
        > PARTITIONED BY (vd STRING,country STRING)
        > STORED AS ORC;
        OK
        Time taken: 0.144 seconds
        hive>
      由于分区字段vd(View Data)和country会出现在数据存放的目录中,所以无需在放在数据表对应的字段列表中。
      创建完ORC分区表后,采用以下DDL语句将page_view表中的数据加载到新表orc_page_view中,数据是1999年1月15日产生的来自四个国家(us:美国,de:德国)的用户访问日志:
          hive> FROM page_view pv
            > INSERT OVERWRITE TABLE orc_page_view
            > PARTITION (vd = '19990115', country = 'us')
            > SELECT view_time,userid,page_url,referrer_url,ip WHERE pv.view_time LIKE '1999/01/15%' AND pv.country = 'us'
            > INSERT OVERWRITE TABLE orc_page_view
            > PARTITION (vd = '19990115', country = 'de')
            > SELECT view_time,userid,page_url,referrer_url,ip WHERE pv.view_time LIKE '1999/01/15%' AND pv.country = 'de';
  (3)数据查询。使用HQL产生1999年1月15日的报表:
      SELECT country,count(userid) FROM page_view WHERE view_time = "19990115" GROUP BY country;
    
  用户可讲HQL产生的结果写入MySQL数据库,以便前段可视化展示。
  以上三个步骤是不断迭代进行的,将每天的数据存入ORC分区表orc_page_view中,进而可以获取某一段时间的统计报表。
                
hive> FROM page_view pv
> INSERT OVERWRITE TABLE orc_page_view
> PARTITION (vd = '19990115', country = 'us')
> SELECT view_time,userid,page_url,referrer_url,ip WHERE pv.view_time LIKE '1999/01/15%' AND pv.country = 'us'
> INSERT OVERWRITE TABLE orc_page_view
> PARTITION (vd = '19990115', country = 'de')
> SELECT view_time,userid,page_url,referrer_url,ip WHERE pv.view_time LIKE '1999/01/15%' AND pv.country = 'de';
Query ID = root_20190520145050_bc6612ae-b276-4455-8784-d24d59e3b584
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1552552068924_7045, Tracking URL = http://storage101.aggrx:8088/proxy/application_1552552068924_7045/
Kill Command = /opt/cloudera/parcels/CDH-5.15.1-1.cdh5.15.1.p0.4/lib/hadoop/bin/hadoop job -kill job_1552552068924_7045
Hadoop job information for Stage-2: number of mappers: 1; number of reducers: 0
2019-05-20 14:50:48,769 Stage-2 map = 0%, reduce = 0%
2019-05-20 14:50:55,115 Stage-2 map = 100%, reduce = 0%, Cumulative CPU 4.56 sec
MapReduce Total cumulative CPU time: 4 seconds 560 msec
Ended Job = job_1552552068924_7045
Stage-5 is selected by condition resolver.
Stage-4 is filtered out by condition resolver.
Stage-6 is filtered out by condition resolver.
Stage-11 is selected by condition resolver.
Stage-10 is filtered out by condition resolver.
Stage-12 is filtered out by condition resolver.
Moving data to: hdfs://storage-ha/user/hive/warehouse/test.db/orc_page_view/vd=19990115/country=us/.hive-staging_hive_2019-05-20_14-50-35_046_58667942699678678-1/-ext-10000
Moving data to: hdfs://storage-ha/user/hive/warehouse/test.db/orc_page_view/vd=19990115/country=de/.hive-staging_hive_2019-05-20_14-50-35_046_58667942699678678-1/-ext-10002
Loading data to table test.orc_page_view partition (vd=19990115, country=us)
Loading data to table test.orc_page_view partition (vd=19990115, country=de)
Partition test.orc_page_view{vd=19990115, country=us} stats: [numFiles=1, numRows=1, totalSize=733, rawDataSize=488]
Partition test.orc_page_view{vd=19990115, country=de} stats: [numFiles=1, numRows=5, totalSize=1035, rawDataSize=2465]
MapReduce Jobs Launched:
Stage-Stage-2: Map: 1 Cumulative CPU: 4.56 sec HDFS Read: 8269 HDFS Write: 1965 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 560 msec
OK
Time taken: 23.25 seconds
hive>

hive> FROM page_view pv  INSERT OVERWRITE TABLE orc_page_view PARTITION (vd = '19990115', country = 'us') SELECT view_time,userid,page_url,referrer_url,ip WHERE pv.view_time LIKE '1999/01/15%' AND pv.country = 'us' INSERT OVERWRITE TABLE orc_page_view  PARTITION (vd = '19990115', country = 'de') SELECT view_time,userid,page_url,referrer_url,ip WHERE pv.view_time LIKE '1999/01/15%' AND pv.country = 'de';

hive> SELECT country,count(userid) FROM page_view WHERE view_time = "19990115" GROUP BY country;
Query ID = root_20190520145959_a5af9c6d-1704-4494-bbb1-22d020badc36
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Starting Job = job_1552552068924_7048, Tracking URL = http://storage101.aggrx:8088/proxy/application_1552552068924_7048/
Kill Command = /opt/cloudera/parcels/CDH-5.15.1-1.cdh5.15.1.p0.4/lib/hadoop/bin/hadoop job -kill job_1552552068924_7048
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2019-05-20 14:59:59,869 Stage-1 map = 0%, reduce = 0%
2019-05-20 15:00:07,174 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 4.41 sec
2019-05-20 15:00:16,563 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 7.87 sec
MapReduce Total cumulative CPU time: 7 seconds 870 msec
Ended Job = job_1552552068924_7048
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 7.87 sec HDFS Read: 10803 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 7 seconds 870 msec
OK
Time taken: 38.087 seconds
hive>

hive> SELECT country,count(userid) FROM page_view WHERE view_time = "19990115" GROUP BY country;

博主推荐阅读:Hive快速入门篇之HQL的基础语法(https://www.cnblogs.com/yinzhengjie/p/9154339.html)。

HQL基本语法及应用案例的更多相关文章

  1. 075 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 07 综合案例-数组移位-主方法功能4的实现

    075 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 07 综合案例-数组移位-主方法功能4的实现 本文知识点:综合案例-数组移位-主方法功能4的实现 说明:因为 ...

  2. 074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现

    074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现 本文知识点:综合案例-数组移位-主方法功能3的实现 说明:因为 ...

  3. 073 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 05 综合案例-数组移位-主方法功能1和2的实现

    073 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 05 综合案例-数组移位-主方法功能1和2的实现 本文知识点:综合案例-数组移位-主方法功能1和2的实现 说 ...

  4. 072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法

    072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法 本文知识点:综合案例-数组移位-在指定位置处插入数据方法 ...

  5. 071 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 03 综合案例-数组移位-显示数组当中所有元素的的方法

    071 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 03 综合案例-数组移位-显示数组当中所有元素的的方法 本文知识点:综合案例-数组移位-显示数组当中所有元素 ...

  6. 070 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 02 综合案例-数组移位-从键盘接收数据

    070 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 02 综合案例-数组移位-从键盘接收数据 本文知识点:综合案例-数组移位-从键盘接收数据 说明:因为时间紧张 ...

  7. 069 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 01 综合案例-数组移位-案例需求

    069 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 01 综合案例-数组移位-案例需求 本文知识点:综合案例-数组移位-案例需求 说明:因为时间紧张,本人写博客 ...

  8. 《java入门第一季》之java语法部分小案例

    到这里举一个小例子把语法部分梳理一下,下一节开始进入java正式基础--面向对象的学习整理. 案例: /* 某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全, 在传递过程中需要加密 ...

  9. Jenkins系列之pipeline语法介绍与案例

    Jenkins Pipeline 的核心概念: Pipeline 是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化. ...

随机推荐

  1. SDN实验---使用git安装Mininet

    0:补充Ubuntu截屏 截全屏 printscreen 截取当前窗口 alt + printscreen 截取任意矩形 shift + printscreen 截取全屏到剪切板 ctrl + pri ...

  2. Python 初级 6 循环

    一.一个简单的for循环 1 重复做相同的事 for looper in [1, 2, 3, 4, 5]: print("hello") 1 looper的值从1开始, 所以loo ...

  3. [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索 II

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  4. sshpass命令使用

    1.直接远程连接某主机 sshpass -p {密码} ssh {用户名}@{主机IP} 2.远程连接指定ssh的端口 sshpass -p {密码} ssh -p ${端口} {用户名}@{主机IP ...

  5. linux : 各个发行版中修改python27默认编码为utf-8

    该方法可解决robot报错:'ascii' codec can't encode character u'\xf1' in position 16: ordinal not in  range(128 ...

  6. laravel 配置自动加载多路由文件

    在 app\Providers\RouteServiceProvider文件下增加方法&注册: 增加之后就可以在routers下建立api文件夹,在里面添加路由了

  7. Java多线程-同步:synchronized 和线程通信:生产者消费者模式

    大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...

  8. MySql 、Oracle 获取表结构和字段信息

    1.MySql获取表结构信息 SELECT TABLE_NAME, TABLE_COMMENT FROM information_schema.`TABLES` WHERE TABLE_SCHEMA ...

  9. PMM--简介与部署

    一.PMM架构 Percona Monitoring and Management是percona一款开源的用于管理和监控MySQL 和MongoDB性能的开源平台,通过PMM客户端收集到的DB监控数 ...

  10. Pycharm配置文档教程

    1 桌面找到快捷方式 双击打开 2 3 4 需要自行注册 5 看自己喜欢选择 喜欢白色 选择左边 喜欢黑色 选择右边 6 7 可选 如果你对 Markdown 感兴趣:或者会用 就点击 install ...