HiveSQL核心技能之表连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HiveSQL核心技能之表连接相关的知识,希望对你有一定的参考价值。

参考技术A

目标:
1、掌握HQL中的各种连接及其组合使用;
2、掌握数据分析中业务指标思路转换的技巧;
3、区分好full join 和 union all 的使用场景;
4、在多表连接时,注意各种细节和业务逻辑;
5、复杂表连接要学会分步骤处理

需注意:
1、表连接时,必须进行重命名;
2、on后面使用的连接条件必须起到 唯一键值 的作用(有时会有多个字段组合);
3、inner可省略不写,效果是一样的
4、表连接时不能使用 a join b join c这种方式,不然会极度浪费电脑的资源和延长查询时间,要在子查询的表里先做好筛选之后在连接;

1)找出在2019年购买后又退款的用户(记得要去重)

注意:一定要先去重,再做表连接,养成良好的习惯(虽然可以先连接再去重,但是那么做会使执行效率很低)

2)在2017年和2018年都购买的用户

3)在2017年、2018年、2019年都有交易的用户

进行左连接之后,以左表为全集,返回能够匹配上的右边表的匹配结果,没有匹配上的则显示NULL。

拓展:
right join:以右表为全集,返回能够匹配上的左边表的匹配结果,没有匹配上的则显示NULL,可以由left join改写出同样的结果。

4)在2019年购买,但是没有退款的用户

5)在2019年由购买的用户的学历分布

6)在2017年和2018年都购买,但是没有在2019年购买的用户

查询两个表的所有用户时使用full join是一个比较好的方法(需要用到coalesce函数:

注:coalesce函数,coalesce(expression1,expression2,...,expression n),依次参考各参数表达式,遇到非null值即停止并返回该值,如果所有的表达式都是空值,最终将返回一个空值。

注:表合并时字段名称必须一致,字段顺序必须一致,而且不用填写连接条件

7)2017-2019年由交易的所有用户数

union all 和 union 的区别:
union all 不会去重,不会排序,效率较快;union 会去重且排序,效率较慢。
如果表很大时,推荐先去重,再进行 union all ,不能直接对表进行 union all,不然效率很慢。

8)2019年每个用户的支付和退款金额汇总

也可以使用 full join 的方式:

9)2019年每个支付用户的支付金额和退款金额

10)首次激活时间在2017年,但是一直没有支付的用户年龄段分布

步骤总结:
1、先筛选出年份为2017注册的用户;
2、没有支付的人;
3、年龄段分布
注意:由于age也是在user_info的表格里,第三步用的字段需要在第一步进行预处理,所以在限制时间的时候需要同时对年龄段进行预处理,这样在第三步的时候才会由年龄段这个字段;需要注意对 case when 的字段进行重命名才能进行后续的操作

11)2018、2019年交易的用户,其激活时间段分布

步骤总结:
1. 取出2018和2019年所有的交易用户的交集
2. 取出所有用户的激活时间
3. 统计时间分布

2-4-运维必备核心技能-nginx实现web服务配置

            定义客户端请求的相关配置
                12、keepalive_timeout timeout [header_timeout]
                    设定保持连接的超时时长,0表示禁止长连接,默认为75s
                13、keepalive_requests number
                    在一次长连接上所允许请求的资源的最大数量,默认为100,如果第12项设置为0,此项没有用处
                14、keepalive_disable none | browser ...
                    对哪种浏览器禁用长连接,现在绝大多数浏览器都支持,但可以设置禁用(防止爬虫)
                15、send_timeout time---客户端断开连接了,服务端要重试的发送,指这个时间
                    向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长
                    对应的就应该有resolver_timeout---主机名解析时用到的
                16、client_body_buffer_size size---如果nginx允许上传文件或post方法,请求报文中才有body,这个大小根据网站的类型调整(论坛要大,电商不动)
                    用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置(发起磁盘IO,这会影响性能)
                17、client_body_temp_path path [level1 [level2 [level3]]]
                    设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量---把用户的url做一次hash计算,然后根据hash值取hash值的几位(1到2位)创建多少个子目录,从左到右或从右到左,创建一级二级三级子目录
                    16进制的数字
                    client_body_temp_path /var/tmp/client_body 2 1 1
                        1:表示用一位16进制数字表示一级子目录:0-f
                        2:表示用2位16进制数字表示二级子目录:00-ff
                        2:表示用2位16进制数字表示三级子目录:00-ff
                    echo http://www.ilinux.io/index.html | md5sum结果是1182a。。。。。。hash值
            对客户端进行限制的相关配置:
                18、limit_rate rate
                    限制响应给客户端的传输速率,单位是bytes/second,0表示无限制
                    登陆的用户一个速率,没登陆的另外一个速率
                19、limit_except method ... {...}---互联网通常只允许get head post方法,其他的太危险了
                    限制对指定的请求方法之外的其它方法的使用客户端

                    limit_except GET {---除了get方法以外的方法,只允许,其他都不允许
                        allow 192.168.1.0/24;
                        deny all;
                    }
            文件操作优化的配置
                20、aio on | off |threads[=pool];---可以使用多少个线程池,一般设置为on
                    是否启用aio功能;
                21、directio size | off;---不是关键选项,使用默认值即可,不用设置
                    在linux主机启用O_DIRECT标记,此处意味文件大于等于给定的大小时使用,例如directio 4m;
                22、open_file_cache off;---几乎所有缓存都是用LRU,最近最少使用
                    open_file_cache max=N [inactive=time];
                        nginx可以缓存以下三种信息:---缓存的是元数据信息而不是文件内容
                        (1)文件的描述符,文件大小和最近一次的修改时间
                        (2)打开的目录结构
                        (3)没有找到的或者没有权限访问的文件的相关信息
                        max=N:可缓存的缓存项上限;达到上限后会使用LRU算法(最近最少使用)实现缓存管理---这里需要缓存到内存中,占用内存空间,小心设置
                        inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项
                23、open_file_cache_valid time;
                    缓存项有效性的检查频率;默认为60s
                24、open_file_cache_min_uses number;
                    在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项
                25、open_file_cache_errors on | off
                    是否缓存查找时发生错误的文件一类的信息;

            ngx_http_access_module模块:
                实现基于IP的访问控制功能
                26、allow address | CIDR |unix: | all;
                27、deny address | CIDR |unix: | all;
            ngx_http_auth_basic_module模块
                实现基于用户的访问控制,使用basic机制进行用户认证;
                28、auth_basic string | off
                29、auth_basic_user_file file;
                    location /admin/ {
                        alias /webapps/app1/data/;
                        auth_basic "Admin Area";
                        auth_basic_user_file /etc/nginx/.ngxpasswd;
                    }
                    注意:htpasswd命令由httpd-tools所提供;yum install -y httpd-tools
                    htpasswd -c -m /etc/nginx/.ngxpasswd tom---会弹出输入密码,用户名tom
                    配置文件中:
                    location ~* ^/(admin|login) {---以admin或login开头做认证
                        auth_basic "admin area or login url";
                        auth_basic_user_file /etc/nginx/.ngxpasswd;---用这个文件做认证
                    }
                    mkdir /data/nginx/vhost1/admin
                    vim /data/nginx/vhost1/admin/index.html
                    访问这个路径,客户端会弹出用户验证的消息,服务器提示的就是admin area or login url32:00

                ngx_http_stub_status_module模块---nginx内建的状态页
                    用于输出nginx的基本状态信息;
                    Active connections:291
                    server accepts handled requests
                        16630948 16630948 31070465
                    Reading:6 Writing:179 Waiting:106

                    Active connections:活动状态的连接数;
                    accepts:已经接受的客户端请求的总数
                    handled:已经处理完成的客户端请求的总数;
                    requests:客户端发来的总的请求数;
                    Reading:处于读取客户端请求报文首部的连接的连接数
                    Writing:处于向客户端发送响应报文过程中的连接数;
                    Waiting:处于等待客户端口、发出请求的空闲连接数;

                    30、stub_status:---注意,这是服务器内部信息,不能随便访问,可以做auth-basic认证
                    配置示例:
                        location /basic_status {
                            stub_status;
                        }

                ngx_http_log_module模块
                    he ngx_http_log_module module writes request logs in the specified format.

                    31、log_format name string ...;
                        string可以使用nginx核心模块及其它模块内嵌的变量;
                        课外作业:为nginx定义使用类似于httpd的combined格式的访问日志;
                    32、access_log path [format[buffer=size][gzip[=level]][flush=time][if=condition]];---可以定义在http上下文中
                    access_log off;---关闭访问日志,有些监控系统采集可以关闭
                        访问日志文件路径,格式及相关的缓冲的配置;
                        buffer=size---服务器并发量很大,可以把日志缓存到内存中,空闲时再写入磁盘
                        flush=time
                        gzip:日志文件可以压缩存放,但是压缩会浪费cpu时钟周期,一般不压缩
                    33、open_log_file_cache max=N[inactive=time][min_uses=N][valid=time];
                    open_log_file_cache off;---一旦超出利用LRU
                    缓存和缓冲的区别:缓存一般为了加速读,缓冲为了加速写操作
                        缓存各日志文件相关的元数据信息;

                        max:缓存的最大文件描述符数量;
                        min_uses:在inactive指定的时长内访问大于等于此值方可被当作活动项;
                        inactive:非活动时长
                        valid:验证缓存中各缓存项是否为活动项的时间间隔;

                    ngx_http_gzip_module:---浪费的cpu时间可以用传输时间的减小弥补,最终节约了带宽
                        The nbx_http_gzip_module module is a filter that compresses responses using the "gzip" method.This often helps to reduce the size of transmitted data by half or even more.

                        1、gzip on | off;
                            Enables or disables gzipping of responses.
                        2、gzip_comp_level level;---默认是1
                            Sets a gzip compression level of a response.Acceptable values are in the range from 1 to 9.
                        3、gzip_ddisable regex ...;---哪些浏览器不支持压缩可以禁用
                            Disables gzipping of responses for requests with "User-Agent" header fields matching any of the specified regular expressions.
                        4、gzip_min_length length;---默认 20
                            启用压缩功能的响应报文大小阈值;
                        5、gzip_buffers number size;
                            gzip_buffer 32 4k | 16 8k;
                            支持实现压缩功能时为其配置的缓冲区数量及每个缓存区的大小;多少段,每段的大小
                        6、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
                            nginx作为代理服务器接收到从被代理服务器发送的响应报文后,在何种条件下启用压缩功能的;
                                off:对代理的请求不启用
                                no-cache,no-store,private:表示从被代理服务器收到的响应报文首部的Cache-Control的值为此三者中任何一个,则启用压缩功能;
                        7、gzip_types mime-type ...;
                            压缩过滤器,仅对此处设定的MIME类型的内容启用压缩功能;
                        示例:
                        gzip on;
                        gzip_proxy any;
                        gzip_types text/xml text/css application/javascript;

                        8、gzip_vary on | off;
                            要不要在响应报文中如果出现gzip,启用一个Vary:Accept-Encoding可以接收各种各样的格式

                        注意:一般只需要gzip on,gzip_comp_level,gzip_types这三个选项就可以了,如果有代理还要gzip_proxied

以上是关于HiveSQL核心技能之表连接的主要内容,如果未能解决你的问题,请参考以下文章

HiveSQL核心技能之常用函数

2-4-运维必备核心技能-nginx实现web服务配置

Linux核心技能与应用gdfhd

To B产品经理的核心技能是什么?

接口测试核心技能与框架实战

一篇文章了解架构师的核心技能