zoukankan      html  css  js  c++  java
  • skills_hive

    skills_hive

    1 hive常用配置

    <!-- 是否以本地模式启动,默认false -->
    <!-- 作用:hive查询时使用本地查询,不走集群,加快少量数据的查询速度 -->
    <!-- 临时开启 set hive.exec.mode.local.auto=true -->
    <property>
      <name>hive.exec.mode.local.auto</name>
      <value>false</value>
      <description>
    大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。
    不过,有时Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间
    可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。
    对于小数据集,执行时间可以明显被缩短。
    用户可以通过设置hive.exec.mode.local.auto的值为true,来让Hive在适当时候自动启动这个优化。
      </description>
    </property>
    <!-- 设置local mr的最大输入数据量,当输入数据量小于这个值时采用local mr的方式,默认为134217728,即128M -->
    <property>
      <name>hive.exec.mode.local.auto.inputbytes.max</name>
      <value>134217728</value>
    </property>
    
    <!-- 设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,默认为4 -->
    <property>
      <name>hive.exec.mode.local.auto.input.files.max</name>
      <value>4</value>
    </property>
    
    <!-- 让提示符显示当前库,默认false -->
    <property>
      <name>hive.cli.print.current.db</name>
      <value>true</value>
    </property>
    
    <!-- 查询结果中header显示字段名称,默认false -->
    <property>
      <name>hive.cli.print.header</name>
      <value>true</value>
    </property>
    
    <!-- 查询结果中header中显示表名称,默认true -->
    </property>
      <name>hive.resultset.use.unique.column.names</name>
      <value>false</value>
    </property>
    
    <!-- 每个节点可以创建的最大分区数 默认值:100 -->
    <property>
      <name>hive.exec.max.dynamic.partitions.pernode</name>
      <value>100</value>
    </property>
    
    <!-- 每个mr可以创建的最大分区数 默认值:1000 -->
    <property>
      <name>hive.exec.max.dynamic.partitions</name>
      <value>10000</value>
    </property>
    
    <!-- 让可以不走mapreduce任务的,就不走mapreduce任务,默认more -->
    <property>
      <name>hive.fetch.task.conversion</name>
      <value>more</value>
    </property>
    
    <!-- 开启任务并行执行,默认false -->
    <property>
      <name>hive.exec.parallel</name>
      <value>true</value>
      <description>
    当一个sql中有多个job时候,且这多个job之间没有依赖,
    则可以让顺序执行变为并行执行(一般为用到union all的时候)
      </description>
    </property>
    
    
    用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理
    set hive.auto.convert.join = true;
    大表小表的阈值设置(默认25M以下认为是小表)
    set hive.mapjoin.smalltable.filesize=25123456;
    是否在Map端进行聚合,默认为True
    set hive.map.aggr = true;
    在Map端进行聚合操作的条目数目
    set hive.groupby.mapaggr.checkinterval = 100000;
    有数据倾斜的时候进行负载均衡(默认是false)
    set hive.groupby.skewindata = true;
    设置严格模式,默认非严格nonstrict
    set hive.mapred.mode = strict; #开启严格模式
    set hive.mapred.mode = nostrict; #开启非严格模式,默认值
    设置JVM重用
    set mapred.job.reuse.jvm.num.tasks=10;
    开启推测执行(如果用户因为输入数据量很大而需要执行长时间的map或者Reduce task的话,那么启动推测执行造成的浪费是非常巨大大)
    set mapred.map.tasks.speculative.execution=true;
    set mapred.reduce.tasks.speculative.execution=true;
    set hive.mapred.reduce.tasks.speculative.execution=true;
    

    reference:https://blog.csdn.net/Python_Billy/article/details/115269401

    2 hive交互方式,beeline使用方式

    使用beeline的原因:
    beeline的输出结果更加规整,并且结果列之间有分隔虚线,如下所示:

    0: jdbc:hive2://localhost:10000/db1> select * from t_msg;
    +-----+--------+----------------------------+----------+--+
    | id | name |       location        |   city   |
    +-----+--------+----------------------------+----------+--+
    | 1  | allen | ["usa","china"]     | [1,3,7]  |
    | 2 | kobe | ["usa","england"] | [2,3,5] |
    +-----+--------+----------------------------+----------+--+
    

    hive交互方式: reference:https://www.cnblogs.com/nacyswiss/p/12605866.html
    beeline使用方式: reference: https://www.cnblogs.com/lenmom/p/11218807.html
    http://www.itcast.cn/news/20190829/12032894477.shtml
    beeline连接hiveserver2时,服务启动顺序如下:
    1. MySQL服务,因为hive的元素是存放在MySQL中的,默认是derby.(MySQL的远程链接必须授权)
    2. metastore服务,看hive-site.xml是否配置,或是否配置忽略,比如在整合impala的时候是需要指定的.
    不过仅仅是使用beeline的话,不需要启动metastore服务!
    hive --service metastore 或 nohup hive --service metastore 2>&1 &
    3. hiveserver2服务
    hive --service hiveserver2 或 nohup hive --service hiveserver2 2>&1 &
    4. 启动beeline客户端
    beeline -n username -p password -u jdbc:hive2://127.0.0.1:10000/databaseName
    如果hive.server2.authentication设置为NONE,则用户名和密码参数不用写

    3 pv,uv,vv,ip概念

    3.1 网站浏览量(PV)

    是PageView的英文缩写,指页面的浏览次数,用以衡量用户访问的网页数量。用户每打开一个页面便记录1次PV,多次打开同一页面则浏览量累计;例如我们在论坛帖子或文章头部经常看到的“阅读次数”或者“浏览次数”。

    3.2 独立访客(UV)

    UV是Unique Visitor的英文缩写,1天内相同的访客多次访问您的网站只计算1个UV,以cookie为依据。所以我们当然系统UV越高越好,这样就说明有很多不同的访客访问网站,网站流量就增加了。

    3.3 独立IP

    独立IP指1天内使用不同IP地址的用户访问网站的数量。同一IP无论访问了网站里的多少个页面,独立IP数均为1。

    3.4 访问次数(VV)

    VV是Visit View的英文缩写,指从访客来到您网站到最终关闭网站的所有页面离开,计为1次访问。若访客连续30分钟没有新开和刷新页面,或者访客关闭了浏览器,则被计算为本次访问结束。访问次数(VV)记录所有访客1天内访问了多少次您的网站,相同的访客有可能多次访问您的网站,那说明这个访客对网站很有兴趣。

    4 explain查看hive sql的执行计划

    explain 
    select t.step, count(step) as num 
    from ods_click_pageviews t 
    where t.datestr = '20181101' and t.body_bytes_sent > 10 
    group by t.step 
    having t.step > 1 and num > 1 
    limit 3;
    
    # 以下为命令结果,实际sql的执行,会按照执行计划,从上往下顺序地执行
    # 注意:having 中的 t.step > 1 ,会被移动到where 子句中优先执行,这就是谓词下推 。
    # 谓词下推 :将过滤表达式尽可能移动至靠近数据源的位置,以使真正执行时能直接跳过无关的数据。
    
    
    Explain
    STAGE DEPENDENCIES:
      Stage-1 is a root stage
      Stage-0 depends on stages: Stage-1
    
    STAGE PLANS:
      Stage: Stage-1
        Map Reduce
          Map Operator Tree:
              TableScan
                alias: t
                Statistics: Num rows: 91 Data size: 18372 Basic stats: COMPLETE Column stats: NONE
                Filter Operator
                  predicate: ((body_bytes_sent > 10) and (step > 1)) (type: boolean)
                  Statistics: Num rows: 10 Data size: 2018 Basic stats: COMPLETE Column stats: NONE
                  Select Operator
                    expressions: step (type: string)
                    outputColumnNames: step
                    Statistics: Num rows: 10 Data size: 2018 Basic stats: COMPLETE Column stats: NONE
                    Group By Operator
                      aggregations: count(step)
                      keys: step (type: string)
                      mode: hash
                      outputColumnNames: _col0, _col1
                      Statistics: Num rows: 10 Data size: 2018 Basic stats: COMPLETE Column stats: NONE
                      Reduce Output Operator
                        key expressions: _col0 (type: string)
                        sort order: +
                        Map-reduce partition columns: _col0 (type: string)
                        Statistics: Num rows: 10 Data size: 2018 Basic stats: COMPLETE Column stats: NONE
                        value expressions: _col1 (type: bigint)
          Reduce Operator Tree:
            Group By Operator
              aggregations: count(VALUE._col0)
              keys: KEY._col0 (type: string)
              mode: mergepartial
              outputColumnNames: _col0, _col1
              Statistics: Num rows: 5 Data size: 1009 Basic stats: COMPLETE Column stats: NONE
              Filter Operator
                predicate: (_col1 > 1) (type: boolean)
                Statistics: Num rows: 1 Data size: 201 Basic stats: COMPLETE Column stats: NONE
                Limit
                  Number of rows: 3
                  Statistics: Num rows: 1 Data size: 201 Basic stats: COMPLETE Column stats: NONE
                  File Output Operator
                    compressed: false
                    Statistics: Num rows: 1 Data size: 201 Basic stats: COMPLETE Column stats: NONE
                    table:
                        input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                        output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
                        serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
    
      Stage: Stage-0
        Fetch Operator
          limit: 3
          Processor Tree:
            ListSink
    
    Time taken: 0.154 seconds, Fetched: 57 row(s)
    

    reference: https://zhuanlan.zhihu.com/p/67565309
    note: 嵌套子查询,先执行里面的子查询语句,后执行外部的查询语句。

    5 hive导出查询结果

    hive -e "set hive.exec.mode.local.auto=true; use dl_venmo_integration_managed_views; select * from account_note where account_note_key in ('2','3')" > account_note_query_result2.txt 
    
    hive -e "set hive.exec.mode.local.auto=true; use dl_venmo_integration_managed_views; select subject,' ------> ', regexp_replace(subject,'\020','') from \`case\` where case_key = '2'" > case_query_result.txt  
    
    hive -e "set hive.exec.mode.local.auto=true; use dl_venmo_integration_managed_views; select * from \`case\` where case_key = '2'" > case_query_result3.txt
    

    6 hive替换不可见字符与替换掉其他字符

    在执行hive计算过程中需要对一些特殊字符进行处理并替换掉,可以使用如下办法

    1. select hex(col) from tb; 获取特殊字符的十六进制编码;或者使用linux vim 进行编辑,将光标移到该字符中,按下ga将会显示 ga是Vim自带的显示光标字符编码的功能,或者使用 :set invlist 显示 不可见字符
    2. 使用regexp_replace函数进行替换,如替换如下不可见字符:
      select regexp_replace(oid,'\u00a0','')
    3. 是否包含中文正则
      regexp_replace(lower(name),'[^0-9a-zA-Z\u4e00-\u9fa5]','') 除中文字母数字以外的字符全部替换掉
      “\u4e00”和“\u9fa5”是unicode编码,并且正好是中文编码的开始和结束的两个值,所以这个正则表达式可以用来判断字符串中是否包含中文

    7

  • 相关阅读:
    指针、数组和结构体的一些思考
    Leetcode589.N-ary Tree Preorder TraversalN叉树的前序遍历
    Leetcode563.Binary Tree Tilt二叉树的坡度
    Leetcode559.Maximum Depth of N-ary TreeN叉树的最大深度
    Leetcode561.Array Partition I数组拆分1
    Leetcode551.Student Attendance Record I学生出勤记录1
    Leetcode543.Diameter of Binary Tree二叉树的直径
    Leetcode520Detect Capital检测大写字母
    Leetcode532.K-diff Pairs in an Array数组中的K-diff数对
    Leetcode496.Next Greater Element I下一个更大的元素1
  • 原文地址:https://www.cnblogs.com/mediocreWorld/p/15145714.html
Copyright © 2011-2022 走看看