大数据笔记

hadoop 生态圈:
            HDFS 分布式文件储存系统
            MapReduce 分布式离线计算引擎
            Yarn 资源调用
            Zookeeper 分布式协调服务
            Hive 数据仓库/数据分析
            Flume 数据采集
            Spoop 数据迁移
            HBase NoSql:实现百万数据级的毫秒级操作

Spark        
            kafka 消息队列
            Scala 函数式编程语言
            Spark RDD
            SparkSql
            SparkStreaming
            SparkCore
            缓存机制

Elasticsearch 大数据弹性分布式搜索引擎
Git GitHUB 分布式项目管理工具/代码托管平台
Docker

俗称的 3V :
                第一个是Volume(海量),数据容量越来越大;第二个是Velocity(速度),数    
             据量增长越来越快,需要处理的速度和响应越来越快;第三个是Variety(多样性),指各种各样类型的数据出现,过去的数据更多的是结构化的,现在越来越多的数据是半结构,甚至是完全没有结构的数据,如文本、邮件甚至于语音、视频等。“3V”是对大数据最基本特征的归纳,得到业界的共识。
               虽然后续不断有人增加对V的理解,如Value(价值),强调大数据中的总体价值大,但是价值密度低;也有Veracity(真实和准确)
             ,强调真实而准确的数据才能让对数据的管控和治理真正有意义,也有Vitality(动态性)    
             强调数据体系的动态性等,这些都有一定的道理,但都不及最初的“3V”具有代表性。
hdfs fsck /                --fsck(文件系统一致性检查)
          集群的基本信息。整个集群的空间多大 所有目录多少  所有文件             所有块(平均的块大小) 所有链接 备份的块                    个数 有没有块坏掉 有没有块备份丢失 集群里面有多少个节点 
hdfs dfs -df -h 
          查看集群的硬盘使用情况
hdfs dfs -du /
          目录下的硬盘空间使用情况
hdfs dfs -ls -h /file
          显示具体的文件大小(差不多就这个意思,转换成可读懂的计量单位)

MapReduce是什么?        --MapReduce(分布式计算模型)
          用于大规模数据处理
          map阶段负责对输入文件进行切分处理,然后汇总再分组给reduce进行处理,以达到高效的分布式计算效率
           1)MapReduce是什么?
               a、MapReduce是一种分布式计算模型模型,用于大规模数据集(大于1TB)的并行运算。
               b、相对于Hadoop框架来说,其最核心设计就是:HDFS和MapReduce。HDFS提供了海量数据的存储,MapReduce提供了对数据的计算。
               c、MapReduce把任务分为 map(映射)阶段和reduce(化简)。

每个MapReduce作业由两个阶段组成
          Map
          Reduce
MaoReduce自动计算
          MapReduce计算是并行和自动分布的;
 
          开发人员只需要专注于实现映射和reduce功能;

          M/R是用Java编写的,但也支持Python流。

如何知道和显示当前所在数据库?
            select current_database();       
               --current(现在的)

数据库描述:
          describe database ...(嗯哼);  
             --(也可以简写为desc) desc formatted ...(嗯哼); (更详细的信息)还可以显示location)--describe(描述)

如何知道你的表是怎么创建的(显示建表语句):
          show create table ...(嗯哼)  
             --显示你的建表语句

Hive Tables --(表)
          External Tables:        --(外部表)
            数据保存在由LOCATION关键字指定的HDFS路径中。Hive不完全管理数据,            因为删除表(元数据)不会删除数据

          Internal Tables:        --(内部表)
            数据保存在默认路径中,例如/user/hive/warehouse/employee。数据完全由Hive管理,因为删除表(元数据)也会删除数据

          Temporary Tables:        -- (临时表)
              temporary table只对当前session有效,session退出之后,table自动删除
              当名称相同时,temporary table优先于相同名称  
                 --(只有drop或rename之后,,才能使用原始表)

              不支持分区和创建索引

如何确定你的表是临时表:
            show create table ...(嗯哼);  
               --(查看)

Hive建表高阶语句:
          CTAS:
              Create Table As Select(之能创建内部表)                                        
                 --CTAS(使用查询创建表)

            create table 要创建的表 as select * from 目标表(复制数据);
              CANNOT create a partition, external, or bucket table  --cannot,partion,external talbe,bucket table(无法,分区,外部表,分桶)
          CTE:
              with Common Table Expression                                                 
                 --CTE(公共表达式)

              CREATE TABLE cte_employee AS 
            WITH
            r1 AS  (SELECT name FROM employee WHERE sex_age.sex= 'Male'),        
               --查询sex 为 Male 的 name 
            r2 AS  (SELECT name FROM r2 WHERE name = 'Michael'),                
               --查询sex 为 Male , name 为 Michael 
            r3 AS  (SELECT name FROM employee  WHERE sex_age.sex= 'Female')     
               --查询sex 为 Male 的 name
            SELECT * FROM r2 UNION ALL SELECT * FROM r3;                         
               --把r2和r3的查询结果写到emp_cte中  --union all(联合 )
 

          like:
              CREATE TABLE 要创建的表 LIKE 目标表(复制表结构); 
                 --(快速的创建一个表,复制目标表的的表结构,没有数据)

          purge:
              drop talbe ...(嗯哼) purge;  
                 --内部表:完全删除,无法找回  外部表:只删除表结构,数据还在

          truncate:
              truncate talbe ...(嗯哼);
                 --用来删除表中的数据(外部表除外)(delete 删除单行)

          重命名表:
              ALTER TABLE table_name rename to new_table_name;
                 --(数据所在的位置和分区都没有改变。)

          修改表属性:
              alter table table_name set TBLPROPERTIES ('EXTERNAL'='TRUE');  
                 --内部表转外部表alter table 

            alter table table_name set TBLPROPERTIES ('EXTERNAL'='FALSE');  
               --外部表转内部表

             增加/更新列:
                 ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type);  
                    --add 在最后一行添加列  replace 删除所有列,重新添加


对Hive表的三连问:
          1.什么是内部,外部表?
            未被external修饰的是内部表(Internal table),被external修饰的为外部表(external table)
          2.它们的区别是什么?: 
            1)内部表数据由Hive自身管理(完全控制),外部表数据由HDFS管理;

            2)内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定;

            3)删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;删除内部表会直接删除元数据(metadata)及存储数据 
            
            4)对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;                          )
          3.它们适合应用在什么场景?
                外部表:
               对数据产生了保护作用,适合用于储存原数据(重要),需要定期将外部数据映射到表中。也适合用于共享资源,(如果要对用户共享数据,可以直接把表给他,                缺点是需要把自己数据库的访问权限给他,让他访问自己的权限。。。  ,那这样我可以把要共享的数据整理到一个新的database,新的External(外部表)里,这样就不会让他访问我的数据库,然后就可以给他hdfs的路径,)
                内部表:在做统计分析时候用到的中间表,结果表可以使用内部表。(对数据清洗和内部转换)
Hive Partition:                                                --partiton (分区)
           在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念

           一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。

           分区是以字段的形式在表结构中存在的。

           分区建表分为2种,一种是单分区,也就是说在表文件夹目录下只有一级文件夹目录。另外一种是多分区,表文件夹下出现多个文件夹嵌套模式。
              --(以文件夹的形式储存在HDFS)

           创建分区表:
             create table table_name (...) partiton by (partiton_name data_type);

           显示表中的分区:
             show partitons table_name;

           添加分区:
                  Alter TABLE table_name ADD  PARTITION (dt='20130101') ;
                     --(一次添加一个分区)

              修改分区:
                  Alter TABLE table_name PARTITION (dt='2008-08-08') SET LOCATION "new location";            
                     --修改location    (每次都要手动Alter)

             Alter TABLE table_name PARTITION (dt='2008-08-08') RENAME TO PARTITION (dt='20080808');   
                --重命名

              删除分区:
                  Alter TABLE table_name DROP  PARTITION (dt='2008-08-08'); 

Dynamic Partition:                                                --dynamic partition(动态分区)
              当数据量很大而我们不知道分区值是多少时,动态分区是非常有用的。

              dynamic partition的两个参数:
             set hive.exec.dynamic.partition=true;
                --开启动态分区(默认是false)(动态分区是一个很刺激的操作,因为一不小心就很可能弄出成千上万个分区,后果嘛...(嗯哼),所有在默认情况下,动态分区是没有打开的)

             set hive.exec.dynamic.partition.mode=nonstrict;    
                --开启允许所有分区都是动态的,否则必须要有静态分区才能使用。
Hive Partition 三连问:
           1.hive partiotion的作用:
                在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念

           2.hive有几种partiton:
             两种:static partiton 和 dynamice partition


           3.不同分区的适用场景和最佳实践:
             静态分区:根据数据到来的频率,新数据的到来
             动态分区:进行数据转换、重新组合,根据已有数据进行动态分区
Hive Buckets:                                                    --buckets(分桶)
           hive.optimize.bucketmapjoin= true
              --(让hive强制分桶,自动按照分桶表的bucket 进行分桶)

           好处:
             1、方便抽样

             2、提高join查询效率

           buckets的column是数据文件的column,不是凭空生成的

           buckets的个数是2的N次方

           buckets是由column组织成多个文件
              --(文件的个数由buckets决定)

           创建 buckets table:
             CREATE TABLE bucketed_user (id INT) name STRING) 
             CLUSTERED BY (id) INTO 4 BUCKETS; 

           往表中插入数据:
             INSERT OVERWRITE TABLE bucketed_users SELECT * FROM users;
                --(向分桶表中插入数据的时候必然要执行一次MapReduce)

           如何将数据插入分桶表
             1.从hdfs或本地磁盘中load数据,导入中间表
             2.通过从中间表查询的方式的完成数据导入
Hive Views:                                              --views(视图)
           视图是建立在已有表的基础上,如果基表被修改或删除,那视图作废
              --(视图赖以建立的这些表称为基表)

             视图可以简化复杂的查询,提供了一定的逻辑独立性

             视图不储存数据,

             视图从数据库的基本表中选取出来的数据组成的逻辑窗口
             --(可以被定义为多个表的连接,也可以被定义为只有部分列可见,也可为部分行可见)

             建立视图支持cte,order by,limit,join,etc;

             查找视图用, show tables/show views (仅在hive v2.2.0之后的版本)

             显示View定义用 show create table view_name;

             hive views的一些常用语句:

               建立视图:create view view_name as select target_table_name;  

               删除视图:drop view_name; 

               更改视图属性:alter view view_name set tblproperties(...); 

               更改视图定义:alter view view_name as select target_table_name; 
Hive Laternl Views:                                                            --laternl views(侧视图)
           例如:

             select id,explode(arry1) from table; —错误

             会报错FAILED: SemanticException 1:40 Only a single expression in the SELECT clause is supported with UDTF's. 

             select explode(array1) from table; —正确

               但是实际中经常要拆某个字段,然后一起与别的字段一起出.例如上面的id和拆分的array元素是对应的.我们应该如何进行连接呢?我们知道直接select
             id,explode()是不行的.这个时候就需要lateral view出厂了.

             lateral view为侧视图,意义是为了配合UDTF来使用,把某一行数据拆分成多行数据.不加lateral view的UDTF只能提取单个字段拆分,并不能塞会原来数据表中.加上lateral view就可以将拆分的单个字段数据与原始表数据关联上

             也可以多次使用lateral view explode

               select id,num1,num2 from table 
               lateral view explode(array1) subview1 as num1
               lateral view explode(array2) subview2 as num2
               where ...;

           行转列:
                select name,loc from e_text lateral view explode(work_place) a as loc;
 Hive Select:                                                                    --(数据映射)
            distinct: 去重(去掉重复的数据)
      

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值