精华内容
下载资源
问答
  • 2021-09-21 20:42:27

    一、行为型设计模式

    上篇,我们呢讲解了-行为型设计模式的责任链、命令、迭代器模式。

    文章地址:https://blog.csdn.net/qq_43692950/article/details/120404903

    这篇文章我们来讲解下行为型设计模式的模板方法、策略、解释器模式。

    二、模板模式

    在模板模式(Template Pattern)中,有些又叫模板方法设计模式,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
    它的优点有封装不变扩展可变, 公共代码便于维护,行为由父类控制子类负责具体实现。

    举个例子:还是拿常用的画形状的案例来说,比如我们画一个图像之后还要加边框,还要画颜色,如果我们画每个图像都要再考虑怎么加入边框和颜色,就显得有点臃肿,因为加入边框和颜色对所有的图像都是一致的,此时就可以将图形边框和颜色在一个统一的模板中定义规则,具体的实现放在具体的子类中。

    下面使用程序演示下上面的例子:

    1. 定义形状的接口,并定义画图形、加边框、画颜色和生成最终的图形
    public interface ShapeInterFace {
        void drawShape();
    
        void drawBorder();
    
        void drawColor();
    
        void genShape();
    }
    
    1. 定义模板
    public abstract class ShapeTemplate implements ShapeInterFace {
        @Override
        public void genShape() {
            System.out.println("开始整合图形");
            drawShape();
            drawBorder();
            drawColor();
            System.out.println("整合完毕");
        }
    }
    
    
    1. 定义圆形的实现
    public class CircleShapeImpl extends ShapeTemplate {
        @Override
        public void drawShape() {
            System.out.println("画圆形");
        }
    
        @Override
        public void drawBorder() {
            System.out.println("画圆形的边框");
        }
    
        @Override
        public void drawColor() {
            System.out.println("画圆形的颜色");
        }
    }
    
    1. 演示
    public class demo {
        public static void main(String[] args) {
            ShapeInterFace shape = new CircleShapeImpl();
            shape.genShape();
        }
    }
    

    在这里插入图片描述

    三、策略模式

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

    还是采用画图形的例子来说,画不同的图形,通过一个标识来做动作,而不是调用具体的类。

    下面使用程序演示下上面的例子:

    1. 定义形状接口
    public interface ShapeInterFace {
        void draw();
    }
    
    1. 定义圆形的实现
    public class CricleShape implements ShapeInterFace {
        @Override
        public void draw() {
            System.out.println("画圆形!");
        }
    }
    
    1. 定义矩形的实现
    public class RectangleShape implements ShapeInterFace {
        @Override
        public void draw() {
            System.out.println("画矩形");
        }
    }
    
    1. 定义三角形的实现
    public class TriangleShape implements ShapeInterFace {
        @Override
        public void draw() {
            System.out.println("画三角形");
        }
    }
    
    1. 定义形状工厂,根据策略拿到不同的实现
    public class FactoryStrategy {
    
        private static Map<String, ShapeInterFace> strategys = new ConcurrentHashMap<String, ShapeInterFace>();
    
        static {
            strategys.put("circle", new CricleShape());
            strategys.put("rectangle", new RectangleShape());
            strategys.put("triangle", new TriangleShape());
        }
    
        public static ShapeInterFace getStrategy(String strategyId) {
           return strategys.get(strategyId);
        }
    }
    
    1. 演示
    public class demo {
        public static void main(String[] args) {
            FactoryStrategy.getStrategy("circle").draw();
            FactoryStrategy.getStrategy("rectangle").draw();
            FactoryStrategy.getStrategy("triangle").draw();
        }
    }
    

    在这里插入图片描述

    四、解释器模式

    解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。

    举个例子,拿SQL解析来看,我们写的一般都是SQL指令然后交给数据库就可以拿到我们想要的数据了,数据库是怎么知道我们查那张表的那些数据呢,其实我们将SQL指令交给数据库后,数据库就在对SQL进行解释,检查语法是否正确,并确定查询的表,查询的字段,和条件等。

    下面使用程序演示下上面的例子,这里简单的做下SQL 解析,便于理解这种设计模式:

    1. 定义SQL解析接口
    public interface SqlnterFace {
        SqlnterFace interpretation(String sql);
        void execute();
    }
    
    1. 定义SELECT查询的实现
    public class SelectSqlImpl implements SqlnterFace {
        String sql;
        String columns;
        String table;
        String condition;
    
        @Override
        public SqlnterFace interpretation(String sql) {
            System.out.println("开始解释SQL ");
            if (!sql.contains("SELECT")) {
                System.out.println("SQL 指令错误!");
                return this;
            }
            this.sql = sql;
            this.columns = sql.split("FROM")[0].split(" ")[1].trim();
            this.table = sql.split("FROM")[1].split("WHERE")[0].trim();
            this.condition = sql.split("WHERE")[1].trim();
            System.out.println("解释结果: 查询的表为:" + this.table + " 查询的列为:" + this.columns + " 条件:" + this.condition);
            return this;
        }
    
        @Override
        public void execute() {
            System.out.println("执行SQL: " + this.sql);
        }
    }
    
    1. 演示
    public class demo {
        public static void main(String[] args) {
            String sql = "SELECT name,age FROM user WHERE id=1 ";
            SqlnterFace sqlExe = new SelectSqlImpl();
            sqlExe.interpretation(sql).execute();
        }
    }
    

    在这里插入图片描述

    更多相关内容
  • 我们的名字被列为微型企业家。 2个 问题:我们如何成为纳税人? 答:在使用ASAN服务的3个工作日内,您被庄严地任命为纳税人。 还提供了e-taxes.gov.az的登录名/密码,以便您可以在线进行工作。 3 问题:我们如何...
  • 电子表格中的列为: 栏名 描述 特雷洛神器 utterance 自然语言待办事项列表文本。 不 class 如果分类,则标签,否则留空。 不 board_name 董事会名称 是的 board_id 板号 是的 short_url Trello上的评论的...
  • 在项目中遇到的一个实际问题。现在有一个DataTable,希望能够自动显示在DataGrid中,但是...直接上代码,稍后逐步解释。1. DataGrid 初始化时分配数据(相应Initialized事件) // 在这里第一次加载数据 DataTabl...

    在项目中遇到的一个实际问题。现在有一个DataTable,希望能够自动显示在DataGrid中,但是因为有一个外键的关系,所以希望用ComboBox在定制某一列。xaml的方式比较死板,所以想用代码进行解析。直接上代码,稍后逐步解释。

    1. DataGrid 初始化时分配数据(相应Initialized事件)

    复制代码
                // 在这里第一次加载数据
                DataTable dt = new DataTable("test");
    
                // first of all, manually create a DataTable
                dt.Columns.Add(new DataColumn("id", typeof(int)));
                dt.Columns.Add(new DataColumn("name", typeof(string)));
                dt.Columns.Add(new DataColumn("测试", typeof(string)));
    
                // insert lines
                DataRow dr = dt.NewRow();
                dr["id"] = 1;
                dr["name"] = "BB1";
                dr["测试"] = "测试1";
                dt.Rows.Add(dr);
    
                dr = dt.NewRow();
                dr["id"] = 2;
                dr["name"] = "BB2";
                dr["测试"] = "测试2";
                dt.Rows.Add(dr);
    
                dr = dt.NewRow();
                dr["id"] = 3;
                dr["name"] = "BB3";
                dr["测试"] = "测试3";
                dt.Rows.Add(dr);
    
                dataGrid.DataContext = dt;
    复制代码

    2. 在WPF框架自动生成某个列的时候,进行干涉(响应AutoGeneratingColumn事件)

    复制代码
    private void OnDataGridAutoGeneratingColumn(
                object sender, DataGridAutoGeneratingColumnEventArgs e)
            {
                // 只想干涉“id”列
                if (e.PropertyName == "id")
                {
                    // 模拟出外键所在的表
                    DataTable dt = new DataTable("test");
    
                    // first of all, manually create a DataTable
                    dt.Columns.Add(new DataColumn("id", typeof(int)));
                    dt.Columns.Add(new DataColumn("name", typeof(string)));
    
                    // insert lines
                    DataRow dr = dt.NewRow();
                    dr["id"] = 5;
                    dr["name"] = "CC1";
                    
                    dt.Rows.Add(dr);
    
                    dr = dt.NewRow();
                    dr["id"] = 6;
                    dr["name"] = "CC2";
                    dt.Rows.Add(dr);
    
                    dr = dt.NewRow();
                    dr["id"] = 7;
                    dr["name"] = "CC3";
                    dt.Rows.Add(dr);
    
    
                    // 方法一:使用DataGridTemplateColumn定制ComboBox,有点是不编辑时,也是显示为ConboBox的样子  
                    DataGridTemplateColumn column = new DataGridTemplateColumn();
                    column.Header = "id";
                    DataTemplate datatemplate = new DataTemplate();
                    FrameworkElementFactory fef = new FrameworkElementFactory(typeof(ComboBox));
                    Binding binding = new Binding();
                    binding.Source = dt.DefaultView;
                    fef.SetBinding(ComboBox.ItemsSourceProperty, binding);
                    Binding selectVal = new Binding("id");
                    selectVal.Mode = BindingMode.TwoWay;
                    fef.SetBinding(ComboBox.SelectedValueProperty, selectVal);
                    fef.SetValue(ComboBox.DisplayMemberPathProperty, "name");
                    fef.SetValue(ComboBox.SelectedValuePathProperty, "id");
                    datatemplate.VisualTree = fef;
                    column.CellTemplate = datatemplate;
                    e.Column = column;
                    
    
                    //方法二:使用DataGridConboBoxColumn,功能与上面的等价
                    //DataGridComboBoxColumn comboBoxColumn = new DataGridComboBoxColumn();
                    //comboBoxColumn.Header = "fuck";
                    //// ComboBox 选择后的值
                    //comboBoxColumn.SelectedValuePath = "id";
                    //// ComboBox 前台显示的值
                    //comboBoxColumn.DisplayMemberPath = "name";
    
                    //Binding binding = new Binding();
                    //// 需要绑定的列
                    //binding.Path = new PropertyPath("id");
    //指定立即更新
    //binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
    //comboBoxColumn.SelectedValueBinding = binding; //Binding itemsSourceBinding = new Binding(); //itemsSourceBinding.Source = dt.DefaultView; //BindingOperations.SetBinding(comboBoxColumn, DataGridComboBoxColumn.ItemsSourceProperty, itemsSourceBinding); //e.Column = comboBoxColumn; } }
    复制代码

    关于ComboBox的各个Property的意思,请参看http://blogs.msdn.com/b/vinsibal/archive/2008/10/31/wpf-datagrid-datagridcomboboxcolumn-v1-intro.aspx  , 里面有一个关于外键的例子。

    关于DataGridTemplateColumn 的使用,主要参考了http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/3ada4685-a032-4bf0-9514-f86c44967678?persist=True ,但是也有一点修改,主要是,一个Panel加进去之后就不工作了。。。


    原文https://www.cnblogs.com/aicro/archive/2013/04/26/3044160.html

    
    
    展开全文
  • 一文解释清楚Google BBR拥塞控制算法原理

    千次阅读 多人点赞 2019-08-07 09:07:14
    基于BBR算法,由于瓶颈路由器的队列为空,最直接的影响就是RTT大幅下降,可以看到下图中CUBIC红色线条的RTT比BBR要高很多: 而因为没有丢包,BBR传输速率也会有大幅提升,下图中插入的图为CDF累积概率分布函数...

    BBR对TCP性能的提升是巨大的,它能更有效的使用当下网络环境,Youtube应用后在吞吐量上有平均4%提升(对于日本这样的网络环境有14%以上的提升):

    报文的往返时延RTT降低了33%,这样如视频这样的大文件传输更快,用户体验更好:

    不像CUBIC这种基于丢包做拥塞控制,常导致瓶颈路由器大量报文丢失,所以重新缓存的平均间隔时间也有了11%提升:

    在Linux4.19内核中已经将拥塞控制算法从CUBIC(该算法从2.6.19内核就引入Linux了)改为BBR,而即将面世的基于UDP的HTTP3也使用此算法。许多做应用开发的同学可能并不清楚什么是拥塞控制,BBR算法到底在做什么,我在《Web协议详解与抓包实战》这门课程中用了6节课在讲相关内容,这里我尝试下用一篇图片比文字还多的文章把这个事说清楚。

    TCP协议是面向字符流的协议,它允许应用层基于read/write方法来发送、读取任意长的字符流:

    但TCP之下的IP层是基于块状的Packet报文来分片发送的,因此,TCP协议需要将应用交付给它的字符流拆分成多个Packet(在TCP传输层被称为Segment)发送,由于网速有变化且接收主机的处理性能有限,TCP还要决定何时发送这些Segment。TCP滑动窗口解决了Client、Server这两台主机的问题,但没有去管连接中大量路由器、交换机转发IP报文的问题,因此当瓶颈路由器的输入流大于其输出流时,便会发生拥塞:

    这虽然是IP网络层的事,但如果TCP基于分层原则不去管,互联网上大量主机的TCP程序便会造成网络恶性拥堵。上图中瓶颈路由器已经造成了网速下降,但如果发送方不管不顾,那么瓶颈路由器的缓冲队列填满后便会发生大量丢包,且此时RTT(报文往返时间)由于存在长队列而极高。

    如上图,最好的状态是没有队列,此时RTT最低,而State2中RTT升高,但没有丢包,到State 3队列满时开始发生丢包。

    TCP的拥塞控制便用于解决这个问题。在BBR出现前,拥塞控制分为四个部分:慢启动、拥塞避免、快速重传、快速恢复:

    慢启动在BBR中仍然保留,它的意义是在不知道连接的瓶颈带宽时,以起始较低的发送速率,以每RTT两倍的速度快速增加发送速率,直到到达一个阈值,对应上图中0-4秒。到该阈值后,进入线性提高发送速率的阶段,该阶段叫做拥塞避免,直到发生丢包,对应上图中8-11秒。丢包后,发速速率大幅下降,针对丢包使用快速重传算法重送发送,同时也使用快速恢复算法把发送速率尽量平滑的升上来。

    如果瓶颈路由器的缓存特别大,那么这种以丢包作为探测依据的拥塞算法将会导致严重问题:TCP链路上长时间RTT变大,但吞吐量维持不变。

    事实上,我们的传输速度在3个阶段被不同的因素限制:1、应用程序限制阶段,此时RTT不变,随着应用程序开始发送大文件,速率直线上升;2、BDP限制阶段,此时RTT开始不断上升,但吞吐量不变,因为此时瓶颈路由器已经达到上限,缓冲队列正在不断增加;3、瓶颈路由器缓冲队列限制阶段,此时开始大量丢包。如下所示:

    如CUBIC这样基于丢包的拥塞控制算法在第2条灰色竖线发生作用,这已经太晚了,更好的作用点是BDP上限开始发挥作用时,也就是第1条灰色竖线。

    什么叫做BDP呢?它叫做带宽时延积,例如一条链路的带宽是100Mbps,而RTT是40ms,那么

    BDP=100Mbps*0.04s=4Mb=0.5MB

    即平均每秒飞行中的报文应当是0.5MB。因此Linux的接收窗口缓存常参考此设置:

    第1条灰色竖线,是瓶颈路由器的缓冲队列刚刚开始积压时的节点。随着内存的不断降价,路由器设备的缓冲队列也会越来越大,CUBIC算法会造成更大的RTT时延!

    而BBR通过检测RTprop和BtlBw来实现拥塞控制。什么是RTprop呢?这是链路的物理时延,因为RTT里含有报文在路由器队列里的排队时间、ACK的延迟确认时间等。什么叫延迟确认呢?TCP每个报文必须被确认,确认动作是通过接收端发送ACK报文实现的,但由于TCP和IP头部有40个字节,如果不携带数据只为发送ACK网络效率过低,所以会让独立的ACK报文等一等,看看有没有数据发的时候顺便带给对方,或者等等看多个ACK一起发。所以,可以用下列公式表示RTT与RTprop的差别:

    RTT我们可以测量得出,RTprop呢,我们只需要找到瓶颈路由器队列为空时多次RTT测量的最小值即可:

    而BtlBw全称是bottleneck bandwith,即瓶颈带宽,我们可以通过测量已发送但未ACK确认的飞行中字节除以飞行时间deliveryRate来测量:

    早在1979年Leonard Kleinrock就提出了第1条竖线是最好的拥塞控制点,但被Jeffrey M. Jaffe证明不可能实现,因为没有办法判断RTT变化到底是不是因为链路变化了,从而不同的设备瓶颈导致的,还是瓶颈路由器上的其他TCP连接的流量发生了大的变化。但我们有了RTprop和BtlBw后,当RTprop升高时我们便得到了BtlBw,这便找到第1条灰色竖线最好的拥塞控制点,也有了后续发送速率的依据。

    基于BBR算法,由于瓶颈路由器的队列为空,最直接的影响就是RTT大幅下降,可以看到下图中CUBIC红色线条的RTT比BBR要高很多:

    而因为没有丢包,BBR传输速率也会有大幅提升,下图中插入的图为CDF累积概率分布函数,从CDF中可以很清晰的看到CUBIC下大部分连接的吞吐量都更低:

    如果链路发生了切换,新的瓶颈带宽升大或者变小怎么办呢?BBR会尝试周期性的探测新的瓶颈带宽,这个周期值为1.25、0.75、1、1、1、1,如下所示:

    1.25会使得BBR尝试发送更多的飞行中报文,而如果产生了队列积压,0.75则会释放队列。下图中是先以10Mbps的链路传输TCP,在第20秒网络切换到了更快的40Mbps链路,由于1.25的存在BBR很快发现了更大的带宽,而第40秒又切换回了10Mbps链路,2秒内由于RTT的快速增加BBR调低了发送速率,可以看到由于有了pacing_gain周期变换BBR工作得很好。

    pacing_gain周期还有个优点,就是可以使多条初始速度不同的TCP链路快速的平均分享带宽,如下图所示,后启动的连接由于过高估计BDP产生队列积压,早先连接的BBR便会在数个周期内快速降低发送速率,最终由于不产生队列积压下RTT是一致的,故平衡时5条链路均分了带宽:

    我们再来看看慢启动阶段,下图网络是10Mbps、40ms,因此未确认的飞行字节数应为10Mbps*0.04s=0.05MB。红色线条是CUBIC算法下已发送字节数,而蓝色是ACK已确认字节数,绿色则是BBR算法下的已发送字节数。显然,最初CUBIC与BBR算法相同,在0.25秒时飞行字节数显然远超过了0.05MB字节数,大约在 0.1MB字节数也就是2倍BDP:

    大约在0.3秒时,CUBIC开始线性增加拥塞窗口,而到了0.5秒后BBR开始降低发送速率,即排空瓶颈路由器的拥塞队列,到0.75秒时飞行字节数调整到了BDP大小,这是最合适的发送速率。

    当繁忙的网络出现大幅丢包时,BBR的表现也远好于CUBIC算法。下图中,丢包率从0.001%到50%时,可以看到绿色的BBR远好于红色的CUBIC。大约当丢包率到0.1%时,CUBIC由于不停的触发拥塞算法,所以吞吐量极速降到10Mbps只有原先的1/10,而BBR直到5%丢包率才出现明显的吞吐量下降。

    CUBIC造成瓶颈路由器的缓冲队列越来越满,RTT时延就会越来越大,而操作系统对三次握手的建立是有最大时间限制的,这导致建CUBIC下的网络极端拥塞时,新连接很难建立成功,如下图中RTT中位数达到 100秒时 Windows便很难建立成功新连接,而200秒时Linux/Android也无法建立成功。

    BBR算法的伪代码如下,这里包括两个流程,收到ACK确认以及发送报文:

    function onAck(packet) 
      rtt = now - packet.sendtime 
      update_min_filter(RTpropFilter, rtt) 
      delivered += packet.size 
      delivered_time = now 
      deliveryRate = (delivered - packet.delivered) / (delivered_time - packet.delivered_time) 
      if (deliveryRate > BtlBwFilter.currentMax || ! packet.app_limited) 
         update_max_filter(BtlBwFilter, deliveryRate) 
      if (app_limited_until > 0) 
         app_limited_until = app_limited_until - packet.size

    这里的app_limited_until是在允许发送时观察是否有发送任务决定的。发送报文时伪码为:

    function send(packet) 
      bdp = BtlBwFilter.currentMax × RTpropFilter.currentMin 
      if (inflight >= cwnd_gain × bdp) 
         // wait for ack or retransmission timeout 
         return 
      if (now >= nextSendTime) 
         packet = nextPacketToSend() 
         if (! packet) 
            app_limited_until = inflight 
            return 
         packet.app_limited = (app_limited_until > 0) 
         packet.sendtime = now 
         packet.delivered = delivered 
         packet.delivered_time = delivered_time 
         ship(packet) 
         nextSendTime = now + packet.size / (pacing_gain × BtlBwFilter.currentMax) 
      timerCallbackAt(send, nextSendTime)

    pacing_gain便是决定链路速率调整的关键周期数组。

    BBR算法对网络世界的拥塞控制有重大意义,尤其未来可以想见路由器的队列一定会越来越大。HTTP3放弃了TCP协议,这意味着它需要在应用层(各框架中间件)中基于BBR算法实现拥塞控制,所以,BBR算法其实离我们很近。理解BBR,我们便能更好的应对网络拥塞导致的性能问题,也会对未来的拥塞控制算法发展脉络更清晰。

    我在《Web协议详解与抓包实战》第5部分课程中第15-20课对拥塞控制有更详细的介绍,详见下方课程二维码:

    展开全文
  • 以下是官方文档关于该用法的解释: The user can specify the optional OUTER keyword to generate rows even when a LATERAL VIEW usually would not generate a row. This happens when the UDTF used does not ...

    1.问题描述

    日常工作中我们经常会遇到一些非结构化数据,因此常常会将Lateral View 结合explode使用,达到将非结构化数据转化成结构化数据的目的,但是该方法对应explode的内容是有非null限制的,否则就有可能造成数据缺失。
    在这里插入图片描述

    SELECT name,info
    FROM
      (
       SELECT name,
       	      split(info_list,',') as info_arrary
       FROM 
         (
          select '张三' as name,'1,2,3' as info_list
          union all
          select '李四' as name,null as info_list
         ) t1     -- 构造测试数据
       ) t2
    LATERAL VIEW explode(t2.info_arrary) a as info ;
    

    查询结果:
    在这里插入图片描述
    查看结果我们可以发现 ‘李四’ 这条数据数据丢了,这就会造成我们最终统计的数据出现错误。

    2.查找原因

    通过定位我们可以发现 ‘李四’ 这一行的info字段为null,其split之后的结果自然也是为null,通过LATERAL VIEW explode之后会形成一个为null的view,这样无法关联出数据,该数据就会丢失。

    3.解决办法(建议使用方法二)

    3.1 方法一

    对子查询中的split结果强制使用coalesce()方法,将null替换成一个为[’’]的数组,直接这么写会误以为string字符串。我们可以使用split(’’,’’)构造出一个[’’]数组,改写后的语句如下

    SELECT name,info
    FROM
      (
       SELECT name,
              coalesce(split(info_list,','),split('','')) as info_arrary
       FROM 
         (
          select '张三' as name,'1,2,3' as info_list
          union all
          select '李四' as name,null as info_list
         ) t1     -- 构造测试数据
       ) t2
    LATERAL VIEW OUTER explode(t2.info_arrary) a as info ;
    

    查询结果:
    在这里插入图片描述
    请注意 ‘李四’ 的结果为空字符,不是null。

    3.2 方法二

    使用官方提供的LATERAL VIEW OUTER来进行解决,该方法类似于left outer join,即如果explode出来的结果为null,也会保留记录,只不过对应字段为null,改写后的语句如下:

    SELECT name,info
    FROM
      (
       SELECT name,
              split(info_list,',') as info_arrary
       FROM 
         (
          select '张三' as name,'1,2,3' as info_list
          union all
          select '李四' as name,null as info_list
         ) t1     -- 构造测试数据
       ) t2
    LATERAL VIEW OUTER explode(t2.info_arrary) a as info ;
    

    查询结果:
    在这里插入图片描述
    请注意 ‘李四’ 的结果为null,而不是空字符。
    以下是官方文档关于该用法的解释:

    The user can specify the optional OUTER keyword to generate rows even when a LATERAL VIEW usually would not generate a row. This happens when the UDTF used does not generate any rows which happens easily with explode when the column to explode is empty. In this case the source row would never appear in the results. OUTER can be used to prevent that and rows will be generated with NULL values in the columns coming from the UDTF.
    

    为了保持代码的稳定性与数据的准确性,建议使用第二种方法。

    展开全文
  • 解释性机器学习

    千次阅读 2019-10-18 10:49:00
    解释性机器学习 背景 写这篇文章的背景就是可解释性机器学习在中文领域资料非常少,有一些零散的资料也不成系统,笔者根据这两个月的整理现阶段的一些可解释性的资料,可常用的代码和库,希望为大家尽一份力。 ...
  • 蘑菇数据集

    2018-03-02 15:16:51
    xgboost、蘑菇数据集、xgboost、蘑菇数据集、xgboost、蘑菇数据集、
  • 题目比较抽象,具体解释一下。 有这么一张表,里面是多位客户在不同时间的不同状态。例如: 客户 时间 状态 小老鼠 20200428 高兴 小八戒 20200429 开心 小笨喵 20200501 悲伤 小老鼠 20200502 难受 ...
  • 更多代码请见:...Spark中组件Mllib的学习之基础概念篇 1解释 colStats:以列为基础计算统计量的基本数据2.代码:/** * @author xubo * ref:Spark MlLib机器学习实战 * more code:https://github.co
  • 提供建议也被列为三种咨询技巧中最有帮助的。 在目前的研究结果的基础上,对未来的研究产生了影响。 辅导员使用的语言技巧会对来访者产生重要影响(Adams, Butler, & Noblin, 1962; Horne, Chaney, & ...
  • 超硬核!小白读了这篇文章,就能在算法圈混了

    万次阅读 多人点赞 2021-03-29 10:21:58
    然而,有个看似笑话的方法声称可以用O(n)实现Bogo排序,依照量子理论的平行宇宙解释,使用量子随机性随机地重新排列元素,不同的可能性将在不同的宇宙中展开,总有一种可能猴子得到了正确的顺序,量子计算机找到了...
  • 当处理某个dataframe时,我们知道这个属于pandas.core.frame.DataFrame 首先这个.dropna()命令是删除不含某列的那一行数据,此时的序号列还是原来的序号列,只不过为NA的那一行的序号被删除了,返回的依旧是数据框...
  • xgboost算模型输出的解释

    万次阅读 2019-05-24 15:15:54
    1. 问题描述 ​ 近来, 在python环境下使用xgboost算法作若干的机器学习任务, 在这个过程中也使用了其内置的函数来可视化树的结果, ... 这个问题该怎么解释呢? 通过翻阅Stack Overflow上的相关问题, 以及搜索到的gi...
  • SNAM:此列为土壤名称,需要用英文写土壤名称,和自己的土壤名称保持一致即可,字母源数据库最长有十几位,不过我建议不要太长。 S5ID:此列的命名方式与MUID相似,这一列统一为2位英文+4位数字,目测没有重复值,...
  • 逻辑回归(Logistic Regression)通俗解释

    万次阅读 多人点赞 2018-04-07 00:16:07
    1.322371 7.152853 0 0.423363 11.054677 0 0.406704 7.067335 1 0.667394 12.741452 0 -2.460150 6.866805 1 0.569411 9.548755 0 -0.026632 10.427743 0 上面的数据一共是3列10行,其中前两列为x1和x2的值,第3列...
  • tf.argmax() axis解释

    千次阅读 2019-09-28 17:51:53
    axis最简单的解释就是返回最大的那个数值的下标,但是新手不好理解。 下面详细解释: 现在有一个张量 a = [1,2,3],是个一维张量 tf.argmax(a,0) 返回值为2,此时表示返回张量a第一个维度中最大元素的下标,a...
  • 始于 1975 年,以开发和销售 BASIC 解释器为目标,如今,微软开发、生产、许可、支持和销售全球软件、用户级电子产品、个人计算机和相关服务。 该公司因其最好的软件产品Windows操作系统、Office套件、IE和Edge而...
  • 尺寸BW 的数量(以行、列为单位)在 2 元素 BWSIZE 中给出。 的类BW 是合乎逻辑的,XY 多边形集合内部为 1,外部为 0。 XY 是具有单独的多边形 (xy) 坐标的元胞数组,作为每个单元格元素中的 N×2 数组。 或者,XY ...
  • 的微型断块圈闭列为深化勘探的主要目标之一。提出了微型断块圈闭表征的主要技术与方法。首先利用测井、地质等信息落实断层目标,结合三维地震资料抓住反向断层关键,进行三维地震资料的精细解释。通过应用此项技术共...
  • 托皮 托皮(“T INDöbject P ython我覆盖整个院落”)是一个Python包用于从... 由于人类发展,狩猎和干旱等,(IUCN)目前将该类Appium列为的物种。 安装 以下说明假定您在计算机上安装了Python解释器; 如果不是这种
  • :表中一列为一个属性 联系 : 1.属性的取值来自某个域 2.笛卡尔积是所有域的所有取值的一个组合 3.笛卡尔积中的每个元素是一个元组 4.关系是一张二维表,表的每行对应着一个元组,表中的每一列对应一个属性 ...
  • 第五,本文着手解释如何解决该问题,以期实现更有效,更民主的项目,并避免经常伴随主要基础设施投资而引起的丑闻。 最后,本文确定了主要基础架构开发中的当前趋势。 有人认为,刺激性支出的快速增长,加上对新兴...
  • sklearn中classification_report解释

    千次阅读 2019-06-07 15:56:36
    classification_report sklearn中的classification_report函数用于显示主要分类指标的...avg / total行为各列的均值(support列为总和)。 参考URL: https://blog.csdn.net/houyanhua1/article/details/87968953
  • 第一题: 大概题意:给一个3*n的数组,从每列中取出...序列为 5 7 5 4 4,最小值为5 个人的做题想法: 可以用res[i][j]数组记录这样的结果:观察到第j列,若当前加入序列的数是a[i][j],只需遍历前一列,即res[i][j]=m
  • classification_report解释

    万次阅读 多人点赞 2018-07-22 15:39:16
    其中列表左边的一列为分类的标签名,右边support列为每个标签的出现次数.avg / total行为各列的均值(support列为总和).  precision recall f1-score三列分别为各个类别的精确度/召回率及 F1 F1值.
  • 什么是VPAVPA,全称Variance Partitioning Analysis,中文成为方差分解分析,该分析的目的是确定指定的环境因子对群落结构变化的解释比例。我们使用CCA/RD...
  • 矩阵乘法AB=C的四种解释

    千次阅读 2021-09-30 16:08:52
    A * B = C的四种解释 (1) row * col = C[i,j] Ci,j=∑k=1n(ai,k∗bk,j)C_i,_j = \sum_{k=1}^n(a_i,_k*b_k,j)Ci​,j​=k=1∑n​(ai​,k​∗bk​,j) (2) A*col(B) = col(C) C的每一列=A∗(B的对应列),即C的每一列为...
  • 解释: 给定长度为 4 的质数列表 primes = [2,7,13,19], 前 12 个超级丑数序列为:[1,2,4,7,8,13,14,16,19,26,28,32] 。 说明: 1 是任何给定 primes 的超级丑数。 给定 primes 中的数字以升序排列。 0 < k ≤ ...
  • 名词解释  断号:比如,连续生成的编号,由于某种操作(通常为删除)后,产生不连续的编号,我们将这种不连续的编号称为断号。  例如,数据库中有一个字段叫合同编号,正常格式为201106_011(表示2011年6月的第11...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,549
精华内容 13,819
关键字:

列为解释