您的位置:首页 > 博客中心 > 数据库 >

Hadoop Hive sql 语法详解

时间:2022-03-15 02:58

      Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构

化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行,通过自己的SQL 去查询分析需

要的内容,这套SQL 简称Hive SQL,使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据。而mapreduce开发人员可以把

己写的mapper 和reducer 作为插件来支持Hive 做更复杂的数据分析。


     它与关系型数据库的SQL 略有不同,但支持了绝大多数的语句如DDL、DML 以及常见的聚合函数、连接查询、条件查询。HIVE不适合用于联机

online)事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。

    HIVE的特点:可伸缩(在Hadoop的集群上动态的添加设备),可扩展,容错,输入格式的松散耦合。


     Hive 的官方文档中对查询语言有了很详细的描述,请参考:http://wiki.apache.org/hadoop/Hive/LanguageManual ,本文的内容大部分翻译自该页面,期间加入了一些在使用过程中需要注意到的事项。


3.1 基本的Select 操作

  • INSERT OVERWRITE TABLE t1  
  • SELECT * FROM t2;  


  •     这样的话,就不要很复杂的锁机制来读写数据。
         INSERT INTO syntax is only available starting in version 0.8。INSERT INTO就是在表或分区中追加数据。

  • 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‘;  

  • FROM (  
  • FROM session_table  
  • SELECT sessionid, tstamp, data  
  • DISTRIBUTE BY sessionid SORT BY tstamp  
  • ) a  
  • REDUCE sessionid, tstamp, data USING ‘session_reducer.sh‘;  
  • 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;  

  • 5.  实际示例

    创建一个表

    CREATE TABLE u_data (
    userid INT,
    movieid INT,
    rating INT,
    unixtime STRING)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ‘/t‘
    STORED AS TEXTFILE;


    下载示例数据文件,并解压缩
    wget
    tar xvzf ml-data.tar__0.gz

    加载数据到表中:

    LOAD DATA LOCAL INPATH ‘ml-data/u.data‘
    OVERWRITE INTO TABLE u_data;

    统计数据总量:

    SELECT COUNT(1) FROM u_data;

    现在做一些复杂的数据分析:

    创建一个 weekday_mapper.py: 文件,作为数据按周进行分割
    import sys
    import datetime

    for line in sys.stdin:
    line = line.strip()
    userid, movieid, rating, unixtime = line.split(‘/t‘)

    生成数据的周信息

    weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
    print ‘/t‘.join([userid, movieid, rating, str(weekday)])

    使用映射脚本

    //创建表,按分割符分割行中的字段值
    CREATE TABLE u_data_new (
    userid INT,
    movieid INT,
    rating INT,
    weekday INT)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ‘/t‘;
    //将python文件加载到系统
    add FILE weekday_mapper.py;

    将数据按周进行分割

    INSERT OVERWRITE TABLE u_data_new
    SELECT
    TRANSFORM (userid, movieid, rating, unixtime)
    USING ‘python weekday_mapper.py‘
    AS (userid, movieid, rating, weekday)
    FROM u_data;

    SELECT weekday, COUNT(1)
    FROM u_data_new
    GROUP BY weekday;

    处理Apache Weblog 数据

    将WEB日志先用正则表达式进行组合,再按需要的条件进行组合输入到表中
    add jar ../build/contrib/hive_contrib.jar;

    CREATE TABLE apachelog (
    host STRING,
    identity STRING,
    user STRING,
    time STRING,
    request STRING,
    status STRING,
    size STRING,
    referer STRING,
    agent STRING)
    ROW FORMAT SERDE ‘org.apache.hadoop.hive.contrib.serde2.RegexSerDe‘
    WITH SERDEPROPERTIES (
    "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|//[[^//]]*//]) ([^ /"]*|/"[^/"]*/") (-|[0-9]*) (-|[0-9]*)(?: ([^ /"]*|/"[^/"]*/") ([^ /"]*|/"[^/"]*/"))?",
    "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
    )
    STORED AS TEXTFILE;

    Hadoop Hive sql 语法详解,布布扣,bubuko.com

    相关推荐

    电脑软件

    热门排行

    今日推荐

    热门手游