精华内容
下载资源
问答
  • HadoopSQL系统研究

    2021-04-25 19:50:47
    HadoopSQL系统研究
  • hadoop Hive sql 总结

    2017-02-22 16:28:12
    Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为...

    Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行,通过自己的SQL 去查询分析需要的内容,这套SQL 简称Hive SQL,使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据。而mapreduce开发人员可以把自己写的mapper 和reducer 作为插件来支持Hive 做更复杂的数据分析。

    它与关系型数据库的SQL 略有不同,但支持了绝大多数的语句如DDL、DML 以及常见的聚合函数、连接查询、条件查询。HIVE不适合用于联机online)事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。

    ps:

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

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

    Intern中用到的常见总结:

    创建表格:

    create external table table_a
    (id string,
    userid string
    )
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ‘,’
    STORED AS INPUTFORMAT
    ‘org.apache.hadoop.mapred.TextInputFormat’
    OUTPUTFORMAT
    ‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat’
    LOCATION
    ‘blabla’;


    create table if not exists xxx
    (date string , userId string)
    partitioned by (dt string)
    row format delimited fields terminated by ‘\t’

    创建表格的时候,例如考虑两个相互对立的表格时候,可以使用flag字段来标记下,不应该创建两个表,不符合范式关系


    查找表格

    SELECT
    CASE WHEN gradeid IN (‘7,8’) THEN ‘8’
    WHEN gradeid IN (‘8,9’, ‘7,8,9’) THEN ‘9’
    ELSE gradeid
    END,
    count(distinct userid)
    FROM t1
    WHERE contiditon1 and condition2
    GROUP BY gradeid

    join , left join , right join 的区别


    Other:

    row_number()
    substring()
    ceil()
    round()


    sql 正则

    select userid
    ,regexp_replace(xx,’[^a-zA-Z].*’,”)
    from (
    select userid
    ,split(regexp_extract(xx,’(||||)(.*)’,2),’||||’) ae
    from temp.test_2 a
    where ad like ‘%|%’
    )
    lateral view explode(ae) rr as ade

    展开全文
  • SQL ON HADOOP

    2019-03-11 11:27:48
    SQL ON HADOOP的框架: 1、hive 2、impala 3、presto 4、drill 5、spark sql

    SQL ON HADOOP的框架:
    1、hive
    2、impala
    3、presto
    4、drill
    5、spark sql

    展开全文
  • Hadoop Hive sql语法详解

    千次阅读 2016-06-10 16:24:59
    构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务...

        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 ,本文的内容大部分翻译自该页面,期间加入了一些在使用过程中需要注意到的事项。

    1.  DDL 操作

    DDL
    •建表
    •删除表
    •修改表结构
    •创建/删除视图
    •创建数据库
    •显示命令

    建表:

    CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
      [(col_name data_type [COMMENT col_comment], ...)] 
      [COMMENT table_comment] 
      [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
      [CLUSTERED BY (col_name, col_name, ...) 
      [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
      [ROW FORMAT row_format] 
      [STORED AS file_format] 
      [LOCATION hdfs_path]
    •CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXIST 选项来忽略这个异常
    •EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)
    •LIKE 允许用户复制现有的表结构,但是不复制数据
    •COMMENT可以为表与字段增加描述
     
    •ROW FORMAT
        DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
            [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
       | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
             用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe 确定表的具体的列的数据。
    •STORED AS
                SEQUENCEFILE
                | TEXTFILE
                | RCFILE    
                | INPUTFORMAT input_format_classname OUTPUTFORMAT             output_format_classname
           如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE 。


    创建简单表:

    hive> CREATE TABLE pokes (foo INT, bar STRING);


    创建外部表:

    CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,
         page_url STRING, referrer_url STRING,
         ip STRING COMMENT 'IP Address of the User',
         country STRING COMMENT 'country of origination')
     COMMENT 'This is the staging page view table'
     ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'
     STORED AS TEXTFILE
     LOCATION '<hdfs_location>';

    建分区表

    CREATE TABLE par_table(viewTime INT, userid BIGINT,
         page_url STRING, referrer_url STRING,
         ip STRING COMMENT 'IP Address of the User')
     COMMENT 'This is the page view table'
     PARTITIONED BY(date STRING, pos STRING)
    ROW FORMAT DELIMITED ‘\t’
       FIELDS TERMINATED BY '\n'
    STORED AS SEQUENCEFILE;

    建Bucket表

    CREATE TABLE par_table(viewTime INT, userid BIGINT,
         page_url STRING, referrer_url STRING,
         ip STRING COMMENT 'IP Address of the User')
     COMMENT 'This is the page view table'
     PARTITIONED BY(date STRING, pos STRING)
     CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
     ROW FORMAT DELIMITED ‘\t’
       FIELDS TERMINATED BY '\n'
    STORED AS SEQUENCEFILE;

    创建表并创建索引字段ds

    hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);

    复制一个空表

    CREATE TABLE empty_key_value_store
    LIKE key_value_store;

    例子

    create table  user_info (user_id int, cid string, ckid string, username string) 

    row format delimited 

    fields terminated by '\t'

     lines terminated by '\n';

    导入数据表的数据格式是:字段之间是tab键分割,行之间是断行。

    及要我们的文件内容格式:

    100636  100890  c5c86f4cddc15eb7        yyyvybtvt
    100612  100865  97cc70d411c18b6f        gyvcycy
    100078  100087  ecd6026a15ffddf5        qa000100


    显示所有表:

    hive> SHOW TABLES;

    按正条件(正则表达式)显示表,

    hive> SHOW TABLES '.*s';

    修改表结构

    •增加分区、删除分区
    •重命名表
    •修改列的名字、类型、位置、注释
    •增加/更新列
    •增加表的元数据信息

    表添加一列 :

    hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);

    添加一列并增加列字段注释

    hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');

    更改表名:

    hive> ALTER TABLE events RENAME TO 3koobecaf;

    删除列:

    hive> DROP TABLE pokes;


    增加、删除分区

    •增加
    ALTER TABLE table_name ADD [IF NOT EXISTS] partition_spec [ LOCATION 'location1' ] partition_spec [ LOCATION 'location2' ] ...
          partition_spec:
      : PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)
    •删除
    ALTER TABLE table_name DROP partition_spec, partition_spec,...

    重命名表

    •ALTER TABLE table_name RENAME TO new_table_name 

    修改列的名字、类型、位置、注释:

    •ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
    •这个命令可以允许改变列名、数据类型、注释、列位置或者它们的任意组合

    表添加一列 :

    hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);

    添加一列并增加列字段注释

    hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');


    增加/更新列

    •ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)  
        
    • ADD是代表新增一字段,字段位置在所有列后面(partition列前)
         REPLACE则是表示替换表中所有字段。

    增加表的元数据信息

    •ALTER TABLE table_name SET TBLPROPERTIES table_properties table_properties:
             :[property_name = property_value…..]
     
    •用户可以用这个命令向表中增加metadata

    改变表文件格式与组织

    •ALTER TABLE table_name SET FILEFORMAT file_format
    •ALTER TABLE table_name CLUSTERED BY(userid) SORTED BY(viewTime) INTO num_buckets BUCKETS
     
    •这个命令修改了表的物理存储属性

    创建/删除视图

    •CREATE VIEW [IF NOT EXISTS] view_name [ (column_name [COMMENT column_comment], ...) ][COMMENT view_comment][TBLPROPERTIES (property_name = property_value, ...)] AS SELECT
    •增加视图
    •如果没有提供表名,视图列的名字将由定义的SELECT表达式自动生成
    •如果修改基本表的属性,视图中不会体现,无效查询将会失败
    •视图是只读的,不能用LOAD/INSERT/ALTER
    •DROP VIEW view_name
    •删除视图

    创建数据库

    •CREATE DATABASE name

    显示命令

    •show tables;
    •show databases;
    •show partitions ;
    •show functions
    •describe extended table_name dot col_name


    2.  DML 操作:元数据存储

    hive不支持用insert语句一条一条的进行插入操作,也不支持update操作。数据是以load的方式加载到建立好的表中。数据一旦导入就不可以修改。

    DML包括:INSERT插入、UPDATE更新、DELETE删除

    •向数据表内加载文件
    •将查询结果插入到Hive表中
    •0.8新特性 insert into

    向数据表内加载文件

    •LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
    •Load 操作只是单纯的复制/移动操作,将数据文件移动到 Hive 表对应的位置。
    •filepath
    •相对路径,例如:project/data1
    •绝对路径,例如: /user/hive/project/data1
    •包含模式的完整 URI,例如:hdfs://namenode:9000/user/hive/project/data1
    例如:

    hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;


    加载本地数据,同时给定分区信息

    •加载的目标可以是一个表或者分区。如果表包含分区,必须指定每一个分区的分区名
    •filepath 可以引用一个文件(这种情况下,Hive 会将文件移动到表所对应的目录中)或者是一个目录(在这种情况下,Hive 会将目录中的所有文件移动至表所对应的目录中)
    LOCAL关键字
    •指定了LOCAL,即本地
    •load 命令会去查找本地文件系统中的 filepath。如果发现是相对路径,则路径会被解释为相对于当前用户的当前路径。用户也可以为本地文件指定一个完整的 URI,比如:file:///user/hive/project/data1.
    •load 命令会将 filepath 中的文件复制到目标文件系统中。目标文件系统由表的位置属性决定。被复制的数据文件移动到表的数据对应的位置

    例如:加载本地数据,同时给定分区信息:

    hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

    • 没有指定LOCAL
             如果 filepath 指向的是一个完整的 URI,hive 会直接使用这个 URI。 否则
    •如果没有指定 schema 或者 authority,Hive 会使用在 hadoop 配置文件中定义的 schema 和 authority,fs.default.name 指定了 Namenode 的 URI
    •如果路径不是绝对的,Hive 相对于 /user/ 进行解释。 Hive 会将 filepath 中指定的文件内容移动到 table (或者 partition)所指定的路径中
     

    加载DFS数据 ,同时给定分区信息:

    hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
    The above command will load data from an HDFS file/directory to the table. Note that loading data from HDFS will result in moving the file/directory. As a result, the operation is almost instantaneous.


    OVERWRITE

    •指定了OVERWRITE
    •目标表(或者分区)中的内容(如果有)会被删除,然后再将 filepath 指向的文件/目录中的内容添加到表/分区中。
     
    •如果目标表(分区)已经有一个文件,并且文件名和 filepath 中的文件名冲突,那么现有的文件会被新文件所替代。
     

    将查询结果插入Hive表

    •将查询结果插入Hive表
    •将查询结果写入HDFS文件系统
    •基本模式
         INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement
    •多插入模式
     FROM from_statement
    INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
    [INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2] ...
    •自动分区模式
     INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement

    将查询结果写入HDFS文件系统

    •INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...
            FROM from_statement
            INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
         [INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]
    •数据写入文件系统时进行文本序列化,且每列用^A 来区分,\n换行

    INSERT INTO 

    •INSERT INTO  TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement

    3.  DQL 操作:数据查询SQL

    SQL操作
    •基本的Select 操作
    •基于Partition的查询
    •Join

    3.1 基本的Select 操作

    SELECT [ALL | DISTINCT] select_expr, select_expr, ...
    FROM table_reference
    [WHERE where_condition]
    [GROUP BY col_list [HAVING condition]]
    [   CLUSTER BY col_list
      | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
    ]
    [LIMIT number]
    •使用ALL和DISTINCT选项区分对重复记录的处理。默认是ALL,表示查询所有记录。DISTINCT表示去掉重复的记录
    •Where 条件
    •类似我们传统SQL的where 条件
    •目前支持 AND,OR ,0.9版本支持between
    •IN, NOT IN
    •不支持EXIST ,NOT EXIST
    ORDER BYSORT BY的不同
    •ORDER BY 全局排序,只有一个Reduce任务
    •SORT BY 只在本机做排序
     
    Limit
    •Limit 可以限制查询的记录数
    SELECT * FROM t1 LIMIT 5
    •实现Top k 查询
    •下面的查询语句查询销售记录最大的 5 个销售代表。
    SET mapred.reduce.tasks = 1 
      SELECT * FROM test SORT BY amount DESC LIMIT 5
    •REGEX Column Specification
    SELECT 语句可以使用正则表达式做列选择,下面的语句查询除了 ds 和 hr 之外的所有列:
    SELECT `(ds|hr)?+.+` FROM test

    例如

    按先件查询

    hive> SELECT a.foo FROM invites a WHERE a.ds='<DATE>';

    将查询数据输出至目录:

    hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='<DATE>';

    将查询结果输出至本地目录:

    hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;

    选择所有列到本地目录 :

    hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;
    hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;
    hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;
    hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;
    hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(1) FROM invites a WHERE a.ds='<DATE>';
    hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;
    hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;

    将一个表的统计结果插入另一个表中:

    hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(1) WHERE a.foo > 0 GROUP BY a.bar;
    hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(1) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;
    JOIN
    hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;

    将多表数据插入到同一表中:

    FROM src
    INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100
    INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200
    INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300
    INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;

    将文件流直接插入文件:

    hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';
    This streams the data in the map phase through the script /bin/cat (like hadoop streaming). Similarly - streaming can be used on the reduce side (please see the Hive Tutorial or examples)


    3.2 基于Partition的查询

    •一般 SELECT 查询会扫描整个表,使用 PARTITIONED BY 子句建表,查询就可以利用分区剪枝(input pruning)的特性
    •Hive 当前的实现是,只有分区断言出现在离 FROM 子句最近的那个WHERE 子句中,才会启用分区剪枝
     

    3.3 Join

    Syntax
    join_table: 
       table_reference JOIN table_factor [join_condition] 
      | table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition 
      | table_reference LEFT SEMI JOIN table_reference join_condition 

    table_reference: 
        table_factor 
      | join_table 

    table_factor: 
        tbl_name [alias] 
      | table_subquery alias 
      | ( table_references ) 

    join_condition: 
        ON equality_expression ( AND equality_expression )* 

    equality_expression: 
        expression = expression
    •Hive 只支持等值连接(equality joins)、外连接(outer joins)和(left semi joins)。Hive 不支持所有非等值的连接,因为非等值连接非常难转化到 map/reduce 任务
     
    •LEFT,RIGHT和FULL OUTER关键字用于处理join中空记录的情况
    •LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现
    •join 时,每次 map/reduce 任务的逻辑是这样的:reducer 会缓存 join 序列中除了最后一个表的所有表的记录,再通过最后一个表将结果序列化到文件系统
    •实践中,应该把最大的那个表写在最后
    join 查询时,需要注意几个关键点
    •只支持等值join
    •SELECT a.* FROM a JOIN b ON (a.id = b.id)
    •SELECT a.* FROM a JOIN b 
        ON (a.id = b.id AND a.department = b.department)
    •可以 join 多于 2 个表,例如
      SELECT a.val, b.val, c.val FROM a JOIN b 
        ON (a.key = b.key1) JOIN c ON (c.key = b.key2)
     
    •如果join中多个表的 join key 是同一个,则 join 会被转化为单个 map/reduce 任务
    LEFTRIGHTFULL OUTER
    •例子
    •SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)
     
    •如果你想限制 join 的输出,应该在 WHERE 子句中写过滤条件——或是在 join 子句中写
    •容易混淆的问题是表分区的情况
    • SELECT c.val, d.val FROM c LEFT OUTER JOIN d ON (c.key=d.key) 
      WHERE a.ds='2010-07-07' AND b.ds='2010-07-07‘
    •如果 d 表中找不到对应 c 表的记录,d 表的所有列都会列出 NULL,包括 ds 列。也就是说,join 会过滤 d 表中不能找到匹配 c 表 join key 的所有记录。这样的话,LEFT OUTER 就使得查询结果与 WHERE 子句无关
    •解决办法
    •SELECT c.val, d.val FROM c LEFT OUTER JOIN d 
      ON (c.key=d.key AND d.ds='2009-07-07' AND c.ds='2009-07-07')
    LEFT SEMI JOIN
    •LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行
    •SELECT a.key, a.value 
      FROM a 
      WHERE a.key in 
       (SELECT b.key 
        FROM B);
           可以被重写为:
          SELECT a.key, a.val 
       FROM a LEFT SEMI JOIN b on (a.key = b.key)
    UNION ALL
    •用来合并多个select的查询结果,需要保证select中字段须一致
    •select_statement UNION ALL select_statement UNION ALL select_statement ...

    4.  从SQL到HiveQL应转变的习惯

    1、Hive不支持等值连接 

    •SQL中对两表内联可以写成:
    •select * from dual a,dual b where a.key = b.key;
    •Hive中应为
    •select * from dual a join dual b on a.key = b.key; 
    而不是传统的格式:

    SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2 WHERE t1.a2 = t2.b2

    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('\073',key)) from dual;
     

    3、IS [NOT] NULL

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

    4、Hive不支持将数据插入现有的表或分区中,

    仅支持覆盖重写整个表,示例如下:

    1. INSERT OVERWRITE TABLE t1  
    2. SELECT * FROM t2;  


    4、hive不支持INSERT INTO, UPDATE, DELETE操作

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


    5、hive支持嵌入mapreduce程序,来处理复杂的逻辑

    如:

    1. FROM (  
    2. MAP doctext USING 'python wc_mapper.py' AS (word, cnt)  
    3. FROM docs  
    4. CLUSTER BY word  
    5. ) a  
    6. REDUCE word, cnt USING 'python wc_reduce.py';  

    --doctext: 是输入

    --word, cnt: 是map程序的输出

    --CLUSTER BY: 将wordhash后,又作为reduce程序的输入


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

    1. FROM (  
    2. FROM session_table  
    3. SELECT sessionid, tstamp, data  
    4. DISTRIBUTE BY sessionid SORT BY tstamp  
    5. ) a  
    6. REDUCE sessionid, tstamp, data USING 'session_reducer.sh';  

    --DISTRIBUTE BY: 用于给reduce程序分配数据


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

    这样能免除多次扫描输入表的开销。

    1. FROM t1  
    2.   
    3. INSERT OVERWRITE TABLE t2  
    4. SELECT t3.c2, count(1)  
    5. FROM t3  
    6. WHERE t3.c1 <= 20  
    7. GROUP BY t3.c2  
    8.   
    9. INSERT OVERWRITE DIRECTORY '/output_dir'  
    10. SELECT t3.c2, avg(t3.c1)  
    11. FROM t3  
    12. WHERE t3.c1 > 20 AND t3.c1 <= 30  
    13. GROUP BY t3.c2  
    14.   
    15. INSERT OVERWRITE LOCAL DIRECTORY '/home/dir'  
    16. SELECT t3.c2, sum(t3.c1)  
    17. FROM t3  
    18. WHERE t3.c1 > 30  
    19. 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 http://www.grouplens.org/system/files/ml-data.tar__0.gz
    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;

    原文链接:http://blog.csdn.net/hguisu/article/details/7256833

    展开全文
  • SQL on Hadoophadoop查询性能优化

    千次阅读 2013-12-28 00:36:34
    SQL on Hadoop就成为了一个重要的工具。为什么非要把SQL放到Hadoop上? SQL易于使用;那为什么非得基于Hadoop呢?Hadoop架构具备很强的鲁棒性和可扩展性。本文从技术架构和最新进展两个角度分析一下各种SQL on ...

    对于一个工程师或者分析师来说,如何查询和分析TB/PB级别的数据是在大数据时代不 可回避的问题。SQL on Hadoop就成为了一个重要的工具。为什么非要把SQL放到Hadoop上? SQL易于使用;那为什么非得基于Hadoop呢?Hadoop架构具备很强的鲁棒性和可扩展性。本文从技术架构和最新进展两个角度分析一下各种SQL on Hadoop产品的优缺点和适用范围:Hive、Tez/Stinger、Impala、Shark/Spark、Phoenix、 Hdapt/HadoopDB、Hawq/Greenplum。

    在互联网企业和有大数据处理需求的传统企业中,基于Hadoop构建的数据仓库的数据来源主要有以下几个:

    通过Flume/Scribe/Chukwa这样的日志收集和分析系统把来自Apache/Nginx的日志收集到HDFS上,然后通过Hive查询。

    通过Sqoop这样的工具把用户和业务维度数据(一般存储在Oracle/MySQL中)定期导入Hive,那么OLTP数据就有了一个用于OLAP的副本了。

    通过ETL工具从其他外部DW数据源里导入的数据。

    目前所有的SQL on Hadoop产品其实都是在某个或者某些特定领域内适合的,没有silver bullet。像当年Oracle/Teradata这样的满足几乎所有企业级应用的产品在大数据时代是不现实的。所以每一种SQL on Hadoop产品都在尽量满足某一类应用的特征。典型需求:

    interactive query (ms~3min)

    data analyst,reporting query (3min~20min)

    data mining,modeling and large ETL (20 min ~ hr ~ day)

    机器学习需求(通过MapReduce/MPI/Spark等计算模型来满足)

    Hive

    Hive是目前互联网企业中处理大数据、构建数据仓库最常用的解决方案,甚至在很多公司部署了Hadoop集群不是为了跑原生MapReduce程序,而全用来跑Hive SQL的查询任务。

    对于有很多data scientist和analyst的公司,会有很多相同表的查询需求。那么显然每个人都从Hive中查数据速度既慢又浪费资源。如果能把经常访问的数据放到内存组成的集群中供用户查询那样效率就会高很多。Facebook针对这一需求开发了Presto,一个把热数据放到内存中供SQL查询的系统。这个设计思路跟Impala和Stinger非常类似了。使用Presto进行简单查询只需要几百毫秒,即使是非常复杂的查询,也只需数分钟即可完成,它在内存中运行,并且不会向磁盘写入。Facebook有超过850名工程师每天用它来扫描超过320TB的数据,满足了80%的ad-hoc查询需求。

    目前Hive的主要缺点:

    data shuffle时网络瓶颈,Reduce要等Map结束才能开始,不能高效利用网络带宽。

    一般一个SQL都会解析成多个MR job,Hadoop每次Job输出都直接写HDFS,大量磁盘IO导致性能比较差。

    每次执行Job都要启动Task,花费很多时间,无法做到实时。

    由于把SQL转化成MapReduce job时,map、shuffle和reduce所负责执行的SQL解析出得功能不同。那么就有Map->MapReduce或者 MapReduce->Reduce这样的需求,这样可以降低写HDFS的IO数量,从而提高性能。但是目前MapReduce框架还不支持 M->MR或者MR->R这样的任务执行。

    目前Hive主要的改进(主要是体现在 Hive 0.11版本上):

    1. 同一条hive sql解析出的多个MR任务的合并。由Hive解析出来的MR jobs中有非常多的Map->MapReduce类型的job,可以考虑把这个过程合并成一个MRjob。 https://issues.apache.org/jira/browse/HIVE-3952

    2. Hive query optimizer(查询优化器是Hive需要持续不断优化的一个topic)

    例如JOIN顺序的优化,就是原来一个大表和多个小表在不同column匹配的条件下JOIN需要解析成多个Map join + MR job,现在可以合并成一个MR job。

    这个改进方向要做的就是用户不用给太多的hint,hive可以自己根据表的大小、行数等,自动选择最快的join的方法(小表能装进内存的话 就用Map join,Map join能和其他MR job合并的就合并)。这个思路跟cost-based query optimizer有点类似了,用户写出来的SQL在翻译成执行计划之前要计算那种执行方式和JOIN顺序效率更高。

    3. ORCFile

    ORCFile是一种列式存储的文件,对于分析型应用来说列存有非常大的优势。

    原来的RCFile中把每一列看成binary blob,没有任何语义,所以只能用通用的zlib,LZO,Snappy等压缩方法。ORCFile能够获取每一列的类型(int还是string), 那么就可以使用诸如dictionary encoding, bit packing, delta encoding, run-length encoding等轻量级的压缩技术。这种压缩技术的优势有两点:一是提高压缩率;二是能够起到过滤无关数据的效果。

    Predicate Pushdown:原来的Hive是把所有的数据都读到内存中,然后再判断哪些是符合查询需求的。在ORCFile中数据以Stripe为单元读取到内 存,那么ORCFile的RecordReader会根据Stripe的元数据(Index Data,常驻内存)判断该Stripe是否满足这个查询的需求,如果不满足直接略过不读,从而节省了IO。

    通过对ORCFile的上述分析,我想大家已经看到了brighthouse的影子了吧。都是把列数据相应的索引、统计数据、词典等放到内存中参与查询条件的过滤,如果不符合直接略过不读,大量节省IO。

    4. HiveServer2的Security和Concurrency特性

    HiveServer2能够支持并发客户端(JDBC/ODBC)的访问。

    Cloudera还搞了个Sentry用于Hadoop生态系统的的安全性和授权管理方面的工作。这两个特点是企业级应用Hadoop/Hive主要关心的。

    5. HCatalog Hadoop的统一元数据管理平台

    目前Hive存储的表格元数据和HDFS存储的表格数据之间在schema上没有一致性保证,也就是得靠管理员来保证。目前Hive对列的改变 只会修改 Hive 的元数据,而不会改变实际数据。比如你要添加一个column,那么你用Hive命令行只是修改了了Hive元数据,没有修改HDFS上存储的格式。还得 通过修改导入HDFS的程序来改变HDFS上存储的文件的格式。Hadoop系统目前对表的处理是’schema on read’,有了HCatlog就可以做到EDW的’schema on write’。

    6. Windowing and Analytics Functions的支持。

    Tez/Stinger

    Tez是一种新的基于YARN的DAG计算模型,主要是为了优化Hive而设计的。目前Tez/Stinger主要是Hortonworks在 搞,他们希望以后把Hive SQL解析成能够在Tez上跑的DAG而不是MapReduce,从而解决计算实时性的问题。Tez的主要特点有:

    底层执行引擎不再使用MR,而是使用基于YARN的更加通用的DAG执行引擎,MR是高度抽象的Map和Reduce两个操作,而Tez则是在这两个操作的基础上提供了更丰富的接口。把Map具体到Input、 Processor、 Sort、Merge、Output,而Reduce也具体化成Input、Shuffle、Sort、Merge、Processor、 Output。其实这个跟Spark有点类似了,都是提供更丰富的可操作单元给用户。

    传统的Reduce只能输出到HDFS,而Tez的Reduce Processor能够输出给下一个Reduce Processor作为输入。

    Hot table也放到内存中cache起来

    Tez service:预启动container和container重用,降低了每次Query执行计划生成之后Task启动的时间,从而提高实时性。

    Tez本身只是YARN框架下得一个library,无需部署。只需指定mapreduce.framework.name=yarn-tez

    Tez/Stinger还有一个最重要的feature : Vectorized Query Execution ( 该feature在HDP 2.0 GA中会提供)。

    目前Hive中一行一行的处理数据,然后调用lazy deserialization解析出该列的Java对象,显然会严重影响效率。Vectorized Query Execution把多行数据同时读取并处理(基本的比较或者数值计算),降低了函数调用的次数,提高了CPU利用率和cache命中率。

    Hive->Tez/Stinger未来工作的主要方向:Cost-based optimizer,基于统计选择执行策略,例如多表JOIN时按照怎样的顺序执行效率最高。统计执行过程中每个中间表的Row/Column等数目,从而决定启动多少个MR执行。

    Impala

    Impala可以看成是Google Dremel架构和MPP (Massively Parallel Processing)结构的混合体,目前主要是Cloudera在主导这个项目。

    优点:

    目前支持两种类型的JOIN:broadcast join和partition join。对于大表JOIN时由于内存限制,装不下时就要dump部分数据到磁盘,那样就会比较慢。

    Impala各个任务之间传输数据采用的是push的方式(MR采用的是pull的方式),也就是上游任务计算完就会push到下游,这样能够分散网络压力,提高job执行效率。

    Parquet列存格式,同时能够处理嵌套数据。通过嵌套数据以及扩展的SQL查询语义,在某些特定的场景上避开了JOIN从而解决了一部分性能的bottleneck。

    Cloudera Manager 4.6以后会有slow query的分析功能。

    Runtime Code Generation

    缺点:

    Impala不会按照group by的列排序

    目前不支持UDF,Impala 1.2即将支持Hive UDFs和Impala native UDFs and UDAs

    不支持像Hive的Serializer/Deserializer,从而使得它做从非结构化到结构化数据的ETL工作比较麻烦。所以本质上讲Impala适合MR配合做ETL之后的查询工作。

    由于Impala的设计初衷是short query,所以不支持fault tolerance。如果参与查询的某个node出错,Impala将会丢弃本次查询。

    安全方面的支持还比较差。impalad之间传输的数据没有加密,不支持表或者列级别的授权。

    每个PlanFragment执行尽量并行化,但是有的时候并不是很容易。例如Hash Join需要等到其中一个表完全Scan结束才能开始。

    虽然有这么多缺点,但是很多公司还是开始尝试Impala了。以百度为 例,百度尝试把MySQL接入Impala的后端作为存储引擎,同时实现相应操作对应的PlanFragment,那么用户来的query还是按照原来的 解析方法解析成各种PlanFragment,然后直接调度到对应的节点(HDFS DataNode/HBaseRegionServer/MySQL)上执行。会把某些源数据或者中间数据放到MySQL中,用户的query涉及到使用 这部分数据时直接去MySQL里面拿。

    Shark/Spark

    由于数据能放到内存尽量放到内存,使用内存非常aggressive。优点是做JOIN时会比较快,缺点是占用内存太大,且自行管理内存,占用内存后不会释放。

    由于Shark借用了Hive的codebase,所以在SQL,SerDes,UDF支持方面和Hive是完全兼容的。

    支持从short query到long time query等不同粒度的查询,所以具有fault tolerance特性。

    性能:特别简单的select…where查询,shark性能的提升不明显(因为hive也不怎么费时间)。但是如果查询比较复杂 select…join…where…group by,hive的job数目会比较多,读写HDFS次数增多,时间自然会变长。当内存还足够大的时候shark性能是最好的,如果内存不够装下所有的数据 时性能会下降,但还是会比Hive好很多。

    Phoenix

    Salesforce开源的基于HBase的SQL查询系统。基本原理是将一个对于HBase client来说比较复杂的查询转换成一系列Region Scan,结合coprocessor和custom filter在多台Region Server上进行并行查询,汇总各个Scan结果。种种迹象表明,Phoenix应该不是个优化的OLAP系统,更像是一个用于简单单表查询,过滤,排 序,检索的OLTP系统。

    优点:

    HBase默认存储的数据类型都是字符串,但Phoenix支持更多的数据类型。

    使用JDBC操作数据,而不是HBase client API

    在RegionServer端通过coprocessor过滤where条件,执行aggregation函数。比较Hive on HBase,Impala on HBase和Phoenix这三者的架构是相似的,不同点就是Hive on HBase和Impala on HBase都没有把coprocessor利用好,都是通过HBase client API把数据读到他们自己进程的内存之后才进行的filter, aggregation等操作。

    从查询的角度来看HBase的column主要分为两类:primary key(row key column)和other columns。主要的不同是row key column能够利用Region Server的index, filter, sort等特性,而other columns没有这些特性,只能通过二级索引辅助做一些优化。Phoenix能够在HBase上创建二级索引用于优化条件查询(目前只支持在 static table上建二级索引,一个更通用的HBase二级索引实现方法参考 https://github.com/Huawei-Hadoop/hindex)。

    如果是row key column上的IN/OR/LIKE条件,可以通过Region Server的skip scan filter优化。

    Dynamic columns支持。

    AutoCommit=false时(默认是false)把所有操作先缓存在客户端,只有你显示commit时才一次批量提交到HBase,SQL解析优化全是在客户端做,这个有点事务的意思。

    缺点:

    不支持JOIN,考虑到HBase的设计初衷是尽量用冗余数据减少复杂的JOIN操作,实际上可以把相关数据都放在同一个表里,而不需要为了减少数据冗余,拆分到多个表中,所以很大程度也可以认为这不是一个缺点。

    从架构上看也仅是把SQL转成HBase Client的API和coprocessor的调用,而且coprocessor还不适合大规模数据的传输,所以如果中间结果的数据量还是比较大的话性能问题还是很明显的。

    这个缺点是所有的基于HBase的SQL系统都有的(包括Hive on HBase和Impala on HBase)。不管什么请求到HBase Region Server这边都得通过RegionScanner,这个接口不是面向OLAP型应用优化的存储文件读取接口。例如RegionScanner的实现里 好多条件比较,是不利于全表扫描的。

    还有个问题就是coprocessor的问题了,由于coprocessor和HBase Region Server是在一个JVM里面,所以当coprocessor计算逻辑非常复杂,中间结果数据量很大的时候会占用大量内存。同时coprocessor 不是流式地读取数据,某些节点数据积累过多也会造成内存不够用的问题。

    RoadMap:

    JOIN支持,虽然有点不符合设计初衷,但是大家都支持,就我不支持,太过时了吧。

    Transaction支持,通过参考 https://github.com/yahoo/omid的方法。

    Online Schema Evolution,动态改变column的类型,rename等。

    Hadapt/HadoopDB

    架构和Hive相似,底层存储引擎有两种:HDFS和RDBMS(PostgreSQL),一个DataNode节点上有一个RDBMS节点。

    提供两种接口:SQL和MR,SQL也是解析成MR job来执行的,所以总的来说执行引擎都是MR。

    把多个MR任务,转换成单node上的SQL+一个MR(data shuffle),这个跟水平压缩,垂直压缩类似,尽量减少SQL解析出的MR task个数,减少任务之间写HDFS的IO数据量。把一个SQL拆解成两部分:适合SQL做的用单机SQL,不适合的用MR(data shuffle)

    和Hive的不同点在于Hive只能操控HDFS上的数据,而Hadapt可以操控HDFS和RDBMS两种数据来源。对于RDBMS这个数据 源来说,数据被预先load到分布式的RDBMS节点中,有统一的Catalog管理所有RDBMS中的数据。例如Map中的有些执行逻辑直接通过一个在 RDBMS上执行的SQL来获得(修改InputFormat),然后使用MR来做JOIN/Group By。而且如果在数据被load到分布式PG节点上时分布情况正好符合group by/order by的条件,那么还省得通过MR的shuffle来做了。

    Hadapt的本质还是把SQL解析成MR任务来做,所以Hive的有些缺点(启动时间长,JOIN效率较低)它也是具有的。还有如果想要join/group by/order by能够在RDBMS数据源之间高效执行,还得考虑数据预分布的问题。

    在执行多个查询的时候,后面的查询能够利用前面查询的查询结果(有点类似于数据仓库中的物化视图的概念),从而可以提高查询的性能。

    现在企业级应用大多使用的方案是Hadoop+MPP的方式,即通过Hadoop批处理非结构化数据(进行ETL操作)然后通过 connector导入MPP进行结构化数据的查询操作。但是这只是临时的替代方案,Hadapt说invisible loading才是最合理的,这样企业就有了一个统一分析平台。

    Hawq

    原来GPDB中的存储是本地磁盘,现在改成HDFS,原来GPDB的单节点的RDBMS只充当执行引擎的功能,不再充当存储引擎功能。

    查询执行通过GPDB的并行执行引擎(不再使用MR),每次查询开始把数据从HDFS中导入到GPDB,执行过程中通过内存交换数据而非MR那样每次任务结束都写磁盘。

    GP特有的cost-based parallel query optimizer and planner是它的一大优势,也是目前其他大多数的产品中没有的,它能够帮用户选出该SQL最高效的执行顺序。

    使用GPDB充当执行引擎的好处:标准SQL兼容;支持ACID事务;JDBC/ODBC支持;JOIN顺序优化和索引支持(查询优化器);支持行/列两种存储格式。

    GPXF使得Hawq能够读取存储在HDFS上的任何格式的数据以及存储在其他文件系统和设备中的数据。

    底层的HDFS需要支持trancate语义和native C interface。

    支持In-Database analytics ( http://madlib.net/ ):

    性能相关:

    Scott Yara(Greenplum老大)公开承认Hawq比pure GPDB要慢。这么做的目的无非就是更好的利用HDFS的可扩展性,统一存储管理。

    和其他SQL on Hadoop产品的性能对比方面,Hawq在group by和join操作上与其他方案相比优势明显,前提是数据量不是特别大。(是不是因为数据导入的时候partition做的好呢,是不是拿load的时间 换group by/join的时间呢?)

    总之,目前在SQL on Hadoop领域普遍比较薄弱的环节是:

    1. workload management and query optimization多个表的JOIN如何执行,例如3个表的JOIN会有6种执行策略,那么哪一种才是效率最高的呢。显然要通过计算每种执行顺序的开销来获得。在传统数据库或者数据仓库领域都有非常好的查询优化器,而在分布式系统中该如何衡量这些指标(磁盘IO,网络带宽,内存)与最后查询效率之间的关系是个需要认真研究的问题。

    2. 关联子查询correlated sub-queries还是没有谁能够实现。在TPC-H中又很多关联子查询的例子,但是现在的SQL on Hadoop产品都不支持。听Impala的人说,他们客户对这个的需求不是很强烈,大部分关联子查询可以转化成JOIN操作。但是目前的商业产品像 Hawq是支持关联子查询的。

    除了上面主要讨论的开源产品以外,大数据分析领域还有很多商业产品。这些商业产品可以分为两类:一类是面向企业级应用的、以卖license或软硬件一体机形式出售的Teradata/Aster Data, HP/Vertica, SAP/HANA,IBM/BigSQL, Oracle和Microsoft也有类似的产品;另一类是利用大规模云计算基础设施,提供的数据分析服务的Google/BigQuery(典型的Analysis as a Service)和Amazon/Redshif。

     文章来源:http://www.aboutyun.com/thread-6281-1-1.html

    展开全文
  • 梁堰波:SQL on Hadoop

    热门讨论 2014-05-29 14:09:41
    2014年3月13日,CSDN在线培训第一期“用SQL-on-Hadoop构建互联网数据仓库与商务智能系统”圆满结束,本次培训讲师是来自美团网的梁堰波,在培训中梁堰波分享了目前在互联网领域数据仓库和商务智能系统构建的业务需求...
  • hadoop hive sql语法解释

    千次阅读 2011-08-04 16:10:00
    SQL 操作 按先件查询 hive> SELECT a.foo FROM invites a WHERE a.ds='<DATE>'; 将查询数据输出至目录 hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='<DATE>'; ...
  • SQL On Hadoop框架了解

    2020-05-04 21:32:45
    本文主要是对最近了解的一些SQLOn Hadoop的框架做一个简单的总结。虽然现在NoSQL伴随着大数据应用崛起,但是SQL仍然是最受欢迎的操作手段,比如Spark SQL,HiveSQL等等。 为什么要SQL On Hadoop: 最长使用的...
  • 1.hive内联支持什么格式? 2.分号字符注意什么问题? 3.hive中empty是否为null? 4.hive是否支持插入现有表或则分区中?...•SQL中对两表内联可以写成: •select * from dual a,dual b where a.key = b.key;
  • hadoop hive sql(HQL)语法解释

    千次阅读 2012-05-07 20:31:29
    SQL 操作 按先件查询 hive> SELECT a.foo FROM invites a WHERE a.ds='<DATE>'; 将查询数据输出至目录 hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='<DATE>'; ...
  • SQL on Hadoop 其中常用工具简单介绍

    千次阅读 2013-10-22 11:10:00
    摘要:SQL on Hadoop对于大数据而言非常重要。本文从技术架构和最新进展的角度分析了7种SQL on Hadoop产品的优缺点和适用范围:Hive、Tez/Stinger、Impala、Shark/Spark、Phoenix、 Hdapt/HadoopDB、Hawq/Greenplum...
  • SQL on Hadoop TPCDS性能测试

    千次阅读 2016-04-11 12:14:45
    本测试,重点性能测试4个维度,测试对象为主流SQL on Hadoop性能表现,为技术选型做一些参考,由于硬件资源有限,本测试数据集比较小,前提是所有数据保证都能装载到内存. 内容还涉及到了SQL on RDBMS 和 SQL on ...
  • 主流开源SQLon Hadoop)总结

    千次阅读 2018-05-13 10:06:35
    使用SQL 引擎一词是有点随意的。例如Hive 不是一个引擎,它的框架使用...“SQL-in-Hadoop” 也不适用,虽然Hive 和Impala 主要使用Hadoop,但是Spark、Drill、HAWQ 和Presto 还可以和各种其他的数据存储系统配合使...
  • SQL on Hadoop系统的最新进展

    千次阅读 2014-02-25 16:42:17
    为什么非要把SQL放到Hadoop上? SQL易于使用。...那为什么非得基于Hadoop呢?the robust and scalable architecture of Hadoop ...目前SQL on Hadoop产品主要有以下几种: Hive, Tez/Stinger, Impala, S
  • SQL on hadoop  1.Hive 2.Prestore 3.Impala 类似于Hive,但是是在内存中处理数据 4.Phoneix(基于HBase) 5.Spark SQL
  • This streams the data in the map phase through the script /bin/cat (like hadoop streaming). Similarly - streaming can be used on the reduce side (please see the Hive Tutorial or examples) ...
  • hive或许我们有一个整体的认识,可以转换为mapreduce,那么具体是...Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据
  • Hadoop 10周年生日之际,CSDN主办的“Hadoop英雄会——暨Hadoop 10周年生日大趴”,明略数据的资深工程师梁堰波分享目前主流的 SQL on Hadoop 框架。
  • 基于SQL-on-Hadoop构建网络日志分析平台,实现千亿级日志存储和高效、灵活查询。利用真实TB 级数据集对多种 Hadoop 列存储格式及压缩算法进行性能测试,并对比Hive和Impala引擎日志扫描及统计查询效率,选用Gzip压缩...
  • sql on hadoop方案(2)

    2017-02-09 21:14:08
    8个值得关注的SQL-on-Hadoop框架 数据的操作语言是SQL,因此很多工具的开发目标自然就是能够在Hadoop上使用SQL。这些工具有些只是在MapReduce之上做了简单的包装,有些则是在HDFS之上实现了完整的数据仓库,而有些...
  • Integrate data between Apache Hadoop and SQL Server 2012 and provide business intelligence on the heterogeneous data Overview Integrate data from unstructured (Hadoop) and structured (SQL Server ...
  • 开源SQL-on-Hadoop系统一览.pdf
  • 大数据时代来临,越来越多的企业把数据存储在Hadoop上,本文对常用的sqlonhadoop工具进行了介绍。
  • 查询分析是大数据要解决的核心问题之一,而SQL作为查询分析中使用最简单、最广泛的的语言之一,必然而然的催生了许多支持在Hadoop上使用SQL的系统,这就是所谓的SQL-on-Hadoop系统,其中大众熟知的Hive就是最早的SQL...
  • All SQL-on-Hadoop Solutions are missing the point of Hadoop Posted on October 28, 2013 at 2:52 pm. Written by Daniel Abadi For several years, Hadapt and Hive were the only SQL-on-Hadoop sol
  • 盘点SQL on Hadoop中用到的主要技术

    千次阅读 2015-01-07 12:46:59
    盘点SQL on Hadoop中用到的主要技术 发表于1小时前|165次阅读| 来源github|0 条评论| 作者肥男爱肉 转载自:http://www.csdn.net/article/2015-01-06/2823450 HadoopSQL大数据架构 摘要:自打Hive出现之后,SQL ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,002
精华内容 15,600
热门标签
关键字:

hadooponsql