8.22笔记

8.22笔记

  • 8.22笔记
    • 一、Hive的HQL语法重点问题
      • 1.1 DDL
        • 1.1.1 Hive中数据表的分类问题
        • 1.1.2 特殊的数据类型
      • 1.2 DML
      • 1.3 DQL
        • 1.3.1 查询语法和MySQL大部分都是一致的
      • 1.4 讲了三个数据库的可视化工具
        • 1.4.1 navicat
        • 1.4.2 dbeaver
        • 1.4.3 chat2db
    • 二、Hive中重点问题:Hive函数的使用
      • 2.1 函数分为两种
        • 2.1.1 内置函数
      • 2.2 用户自定义函数
        • 2.2.1 Hive自定义函数的步骤
        • 2.2.2 自定义UDF函数
        • 2.2.3 自定义UDTF函数
        • 2.2.4 删除自定义函数
    • 三、相关代码

8.22笔记

一、Hive的HQL语法重点问题

1.1 DDL

1.1.1 Hive中数据表的分类问题

Hive中数据表的分类只是用来告诉我们Hive底层在HDFS上存储的文件的规则和规范

1.1.2 特殊的数据类型

array、map、struct

Hive数据表可以指定底层的存储格式的分隔符问题row format

1.2 DML

Hive中默认不支持批量的删除和更新操作

  1. 增加数据
    1. 装载数据
    2. 追加和覆盖
  2. 删除数据(只能删除所有数据或者某个分区的数据)–truncate
  3. 数据导入和导出问题

1.3 DQL

1.3.1 查询语法和MySQL大部分都是一致的

  1. 排序问题

    1. 全局排序:DQL查询语法转换的MR底层只有一个reduce任务
      order by

    2. 局部排序:DQL查询语法转换的MR底层可以有多个reduce任务,每个reduce的输出有序,整体没有顺序sort by

      如果要使用sort by进行局部排序,那么需要设置Hive底层的转换的MR程序的reduce任务数大于1

      set mapreduce.job.reduces=num>1

      注意:如果我们只是使用了sort by进行排序,并且reduce的任务数大于1,那么mr程序计算的时候底层会对数据进行分区,分区数就是reduce的任务数,默认情况下,如果只使用了sort by,那么分区机制我们是无法控制

      如果我们在局部排序的时候还想控制每个分区的数据,可以在sort by之前增加上一个distribute By 字段,Distribute By和sort by结合使用的,是用于负责控制分区规则的。分区规则是根据我们指定的分区字段的hash值和分区数取余数。

      如果Distribute By和sort by的字段一样,我们可以使用cluster by替代上述两个操作

  2. 连接查询

    Hive支持了全外连接full join

1.4 讲了三个数据库的可视化工具

1.4.1 navicat

界面特别好看的,收费的

一般只能连接RDBMS关系型数据库,连接底层不是基于JDBC

1.4.2 dbeaver

1.4.3 chat2db

增加了AI大模型

1.4.2~1.4.3:都是免费的,底层都是基于JDBC连接数据库
因此这两个软件不仅可以连接常见的RDBMS,还可以连接大数据环境:Hive、Spark等等

二、Hive中重点问题:Hive函数的使用

Hive中提供了很多的自带函数,自带函数有大部分都是为了统计分析设计的。Hive中的函数大部分都是一个Java类

2.1 函数分为两种

UDF:一对一函数
UDTF:一对多函数
UDAF:多对一函数

2.1.1 内置函数

  1. 如何查看系统自带的内置函数

show functions;

desc function 函数名;

desc function extended 函数名;

  1. Hive中常见的一些内置函数的用法

    1. 数学函数:UDF

      函数名说明
      abs(x)返回x的绝对值
      ceil(x)向上取整,返回比x大的正整数中最小的那一个
      floor(x)向下取整
      mod(a,b)a%b
      pow(a,b)a^b
      round(x,[n])四舍五入 如果不传递n 代表小数点不保留,如果n>=1 代表小数点后保留n位
      sqrt(x)根号x
    2. 字符串函数

      函数名说明
      concat直接拼接,拼接需要传递多个参数,会把多个参数拼接起来,如果有一个参数为null值,那么结果直接为null
      concat_ws可以拼接的分隔符,传递的第一个参数是一个分隔符,如果拼接了null值,null值不计算
      lpad |rpad(str,x,pad)在str左/右边以指定的pad字符填充字符串到指定的x长度
      ltrim|rtrim|trim(str)去除空格
      length(x)返回字符串的长度
      replace(str,str1,replacestr)将字符串中指定字符串替换成为另外一个字符串
      everse(str)字符串反转
      split(str,x):array字符串切割
      substr|substring(str,n,[num]),截取字符串
    3. 日期

      函数名说明
      current_date()返回当前的日期 年月日
      current_timestamp()返回当前时间
      date_format(date,“格式”)格式化时间的
      datediff(date,date1)返回这两个时间的差值(天)
    4. 条件判断函数

      函数名
      if
      case when then [when then] … else end
    5. 特殊函数

      1. 和数组、集合操作有关的函数

        函数内部需要传递一个数组,或者返回值是一个数组类型的函数

        函数名说明
        split(str,spea):array
        collect_set(列名):array将一列中的所有行的数据封装为一个数组 列转行 不允许重复
        将一列中的所有行的数据封装为一个数组 列转行 允许重复
        array(ele…):array
        map(key,value,key,value,key,value…):map
        concat_ws(spe,array(string)):String将一个数组中的所有字符串以指定的分隔符拼接得到一个全新的字符串
        explode(array,map集合)多行多列的数据 炸裂函数 行转列的函数
        如果传递的是array,那么结果是一列多行
        如果传递的是map集合,那么结果就是两列多行

        collect_set(列名):array、collect_list(列名):array

        列转行函数
        将一列的多行数据转换成为一行数据
        UTAF

      2. 和字符串有关的特殊函数:(字符串必须得是URL)

        1. URL的概念

          URL是叫做统一资源定位符,是用来表示互联网或者主机上的唯一的一个资源的
          URL整体上主要有如下几部分组成的:
          协议:http/https、ftp、file、ssh
          host:主机名、域名、ip地址
          port:端口号
          path:资源路径
          queryParam:参数 ?key=value&key=value…

          例子:

          http://192.168.35.101:9870/index.html?name=zs&age=20

          https://www.baidu.com/search/a?key=valueURL

          中,如果没有写端口号,那么都是有默认端口,http:80 https:443 ssh:22

        2. parse_url(urlstr,"特殊字符"):string一次只能提取URL的一个成分

        3. parse_url_tuple(urlstr,"特殊字符"...):每一个成分当作一列单独展示,函数可以将一个数据转换成为一行多列的数据函数多了一个特殊字符:QUERY:key

          parse_url_tuple(urlstr,"特殊字符"...) as (列名...)

          2、3:

          hive提供用来专门用来解析URL的函数:从URL中提取URL组成成分
          特殊字符代表的是URL的组成成分,特殊字符有如下几种:
          HOST:提取URL中的主机名、IP地址
          PATH,:提取URL中资源路径
          QUERY, 提取URL中的所有请求参数
          PROTOCOL, 提起URL中的请求协议
          AUTHORITY,
          FILE,
          USERINFO,
          REF,

      3. 侧视图

        1. 侧视图Lateral View专门用来和UDTF函数结合使用,用来生成一个虚拟表格,然后这个虚拟表格一行数据会生成一个,虚拟表格是动态的,一行数据会生成一个虚拟表格,生成的虚拟表格和当前行做一个笛卡尔乘积,得到一些我们普通SQL无法实现的功能
        2. 侧视图使用场景:一个表格中,某一行的某一列是一个多字段组成的数据,我们想把多字段的列拆分开和当前行结合得到一个多行的结果。
      4. 开窗函数 overselect子语句中

        1. 开窗函数指的是在查询表数据时,将表按照指定的规则拆分成为多个虚拟窗口(并没有真实的拆分、类似于分组),然后可以在窗口中得到一些只有分组之后才能得到一些信息,然后将信息和原始数据结合起来,实现在同一个查询中既可以得到基础字段,还可以得到聚合字段。既需要普通字段还需要一些聚合信息的时候,开窗函数就是最完美的选择。

        2. 语法:

          函数(参数) over(partition by 列名 order by 字段) as 别名-列名

        3. 可以和窗口函数结合使用的主要有三种类型的函数

          1. first_value(col)|last_value(col) over(partition by 列名 order by 字段) as 别名-列名

          2. 聚合函数

            sum/avg/count/max/min over(partition by 列名) as 列别名

          3. 排名函数

            row_number()/rank()/dense_rank() over(partition by 列名 order by 字段) as 列别名

            排名函数的作用就是对数据开窗之后,查询到某一行数据之后,看一下这行数据在所属窗口的排名-位置,然后根据位置打上一个序号,序号从1开始

            函数名说明
            row_number()序号是从1开始依次递增,如果两行数据排名一致,也会依次编号
            rank()序号是从1开始依次递增,如果两行数据排名一致,两行编号一样的 跳排名
            dense_rank()序号是从1开始依次递增,如果两行数据排名一致,也会依次编号,不会跳排名
          4. 使用场景:求不同组中排名topN的数据信息

2.2 用户自定义函数

用户自定义函数就是我们觉得hive内置函数不满足我们的需求,我们可以自定义函数实现我们想要的功能

2.2.1 Hive自定义函数的步骤

(Hive底层也都是Java,自定义函数也是编写Java代码的)

  1. 创建一个Java项目

  2. 引入编程依赖

    1. 创建lib目录,自己找jar包放到lib目录下,然后lib目录add as library hive的安装目录的lib目录下
    2. 使用maven然后根据gav坐标引入依赖
  3. 编写对应的函数类:UDF、UDTF、UDAF
    大部分自定义都是UDF和UDTF函数

  4. 将编写好的Java代码打成jar包

  5. 将jar包上传到HDFS上

  6. 通过create function …从jar包以全限定类名的方式创建函数

  7. 注意:自定义的函数创建的时候有两种创建方式
    create [temporary] function function_name as “全限定类名” using jar “jar包在hdfs上的路径”

    1. 临时函数:只对本次会话有效
      只可以通过show functions查看,元数据库不会记录
    2. 永久函数:永久生效
      无法通过show functions查看,但是可以通过Hive的元数据库的FUNS表中查看

2.2.2 自定义UDF函数

2.2.3 自定义UDTF函数

2.2.4 删除自定义函数

drop function 函数名

【注意】用户自定义函数有一个特别重要的问题,自定义函数和数据库绑定的。只能在创建函数的数据库使用函数。如果要在其他数据库下使用,需要在其他数据库下把函数重新创建一遍即可。

三、相关代码

-- 查看hive自带的所有函数
show functions;
-- 查看某个函数的用法
desc function abs;
-- 查看某个函数的详细用法
desc function extended parse_url;select sqrt(8);create table demo(name string
);
insert into demo values("zs"),("ls"),("ww");
select * from demo;
select concat_ws("-",collect_set(name)) from demo;select concat_ws("-",name) from demo;
select concat_ws("-","zs","ls",null);select rpad("zs",10,"-");select ltrim("    z   s     ");
select rtrim("    z   s     ");
select trim("    z    s     ");select replace("2022-10-11","-","/");
select reverse("zs");
select split("zs-ls-ww","-");select substring("zs is a good boy",9);select current_timestamp();
select date_format("2022-10-11 20:00:00","HH")
select datediff(current_date(),"2000-10-11");select if(1>2,"zs","ls");
select CASE 10when 10 then "zs"when 20 then "ls"else "ww"ENDselect CASE when 1>2 then "zs"when 1<2 then "ls"else "ww"ENDselect explode(array(1,2,3,4,5));
select map("name","zs","age","20","sex","man");
select explode(map("name","zs","age","20","sex","man"));select parse_url("http://www.baidu.com:80/search/a?name=zs&age=30","QUERY");
select parse_url_tuple("http://www.baidu.com:80/search/a?name=zs&age=30","QUERY","PATH","HOST","QUERY:sex") 
as (query,path,host,sex);-- 侧视图的使用
create table test(name string,age int,hobby array<string>
);insert into test values("zs",20,array("play","study")),("ls",30,array("sleep","study"));
select * from test;select name,age,hobby,temp.hb from test
lateral view explode(hobby) temp as hb;-- 开窗函数的使用
create table student(student_name string,student_age int,student_sex string
);insert into student values("zs",20,"man"),("ls",20,"woman"),("ww",20,"man"),("ml",20,"woman"),("zsf",20,"man");select * from student;-- 查询不同性别的总人数
select student_sex,count(1) from student group by student_sex;
-- 查询表中所有的学生信息,并且每个学生信息后面需要跟上这个学生所属性别组的总人数
select student_name,student_age,student_sex,row_number() over(partition by student_sex order by student_name desc) as sex_count
from student;-- 排名函数的使用场景
create table employees(employees_id int,employees_name string,employees_dept int,employees_salary double
);insert into employees values(1,"zs",1,2000.0),(2,"ls",1,1800.0),(3,"ww",1,1700.0),(4,"ml",1,2000.0),(5,"zsf",1,1900.0),(6,"zwj",2,3000.0),(7,"qf",2,2500.0),(8,"cl",2,2500.0),(9,"jmsw",2,2000.0);select * from employees;
-- 获取每个部门薪资排名前二的员工信息
-- 部门分组 薪资降序排序  排名窗口函数  给每一行数据打上一个序号
select * from(select *,DENSE_RANK() over(partition by employees_dept order by employees_salary desc) as salary_rankfrom employees
) as b
where salary_rank <=2;
package com.sxuek.udf;import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;/*** 类就是从一个字符串中找大写字符个数的函数* UDF*/
public class FindUpperCount extends GenericUDF {/*** 初始化方法,方法是用来判断函数参数的*   指定函数参数的个数以及函数参数的类型* @param objectInspectors   函数参数的类型和个数的一个数组* @return  方法的返回值代表的是函数执行完成之后的返回值类型* @throws UDFArgumentException*/@Overridepublic ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {/*** 1、判断参数的类型和个数是否满足需求*///数组的长度就是函数参数的个数int length = objectInspectors.length;if (length != 1){throw new UDFArgumentException("function only need one param");}else{//ObjectInspector是一个Hive数据类型的顶尖父类 参数的类型ObjectInspector objectInspector = objectInspectors[0];//PrimitiveObjectInspectorFactory是Hive中所有基础数据类型的工厂类//返回函数的执行完成之后输出的结果类型  整数类型return PrimitiveObjectInspectorFactory.javaIntObjectInspector;}}/*** 方法就是函数实现的核心逻辑方法* @param deferredObjects   函数传递的参数* @return 返回值就是函数执行完成之后的返回结果 返回结果必须和initialize的返回值类型保持一致* @throws HiveException*/@Overridepublic Object evaluate(DeferredObject[] deferredObjects) throws HiveException {//获取函数传递的那一个参数DeferredObject deferredObject = deferredObjects[0];//get方法是获取封装的参数值Object o = deferredObject.get();String str = o.toString();int num = 0;for (char c : str.toCharArray()) {if (c >= 65 && c <= 90){num++;}}return num;}/*** HQL的解析SQL的输出----没有用处* @param strings* @return*/@Overridepublic String getDisplayString(String[] strings) {return "";}
}
package com.sxuek.udtf;import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.*;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;import java.util.ArrayList;
import java.util.List;/***  输入参数有两个:*     字符串*     分隔符*  输出结果 一列多行的结果*     word*     zs*     ls*/
public class SplitPlus extends GenericUDTF {/*** 作用:*   1、校验输入的参数*   2、返回UDTF函数返回的列的个数、名字、类型* @param argOIs  当作一个数组来看,里面多个参数组成的* @return* @throws UDFArgumentException*/@Overridepublic StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {List<? extends StructField> allStructFieldRefs = argOIs.getAllStructFieldRefs();if (allStructFieldRefs.size() != 2){throw new UDFArgumentException("function need two params");}else{/*** 返回一列多行 UDTF函数也可以返回多行多列*///返回的列的名字 是一个集合 集合有几项  代表UDTF函数返回几列List<String> columnNames = new ArrayList<>();columnNames.add("word");//返回的列的类型 集合的个数必须和columnNames集合的个数保持一致List<ObjectInspector> columnTypes = new ArrayList<>();columnTypes.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);//构建StandardStructObjectInspector,需要两个List集合 List<String> List<ObjectInspector>StandardStructObjectInspector standardStructObjectInspector = ObjectInspectorFactory.getStandardStructObjectInspector(columnNames,columnTypes);return standardStructObjectInspector;}}/*** UDTF函数执行的核心逻辑*   结果的输出需要借助forward方法* @param objects 函数的输入参数* @throws HiveException*/@Overridepublic void process(Object[] objects) throws HiveException {String str = objects[0].toString();String split = objects[1].toString();String[] array = str.split(split);for (String s : array) {//一行输出需要输出一次  如果输出一行数据 那么只需要调用一次forward方法即可/*** 如果一行数据有多列,可以先创建一个List集合,List<Object> 集合中把一行的多列值全部加加进来*/forward(s);}}/*** close用于关闭一些外部资源* @throws HiveException*/@Overridepublic void close() throws HiveException {}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/48980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【golang】接口类型(interface)使用和原理

接口类型的类型字面量与结构体类型的看起来有些相似&#xff0c;它们都用花括号包裹一些核心信息。只不过&#xff0c;结构体类型包裹的是它的字段声明&#xff0c;而接口类型包裹的是它的方法定义。 接口类型声明中的这些方法所代表的就是该接口的方法集合。一个接口的方法集…

CSS行内,内部,外部以及优先级

1.内联样式表&#xff1a; 将样式编写到style标签里 <style>.context {color: red;} </style> 2. 行内样式&#xff1a; 在 HTML 标签中使用 style 属性设置 CSS 样式 <div style"font-size: 18px;">行内样式</div> 3.外联样式&#xff1…

【数据结构】吃透单链表!!!(详细解析~)

目录 前言&#xff1a;一.顺序表的缺陷 && 介绍链表1.顺序表的缺陷2.介绍链表&#xff08;1&#xff09;链表的概念&#xff08;2&#xff09;链表的结构&#xff08;3&#xff09;链表的功能 二.单链表的实现1.创建节点的结构2.头文件函数的声明3.函数的实现&#xff…

iPhone开启“轻点唤醒”功能但点击屏幕无反应怎么解决?

iPhone的“轻点唤醒”功能启用时&#xff0c;用户只需手指轻触或点击手机屏幕即可快速唤醒设备&#xff0c;无需按压任何按钮。然而&#xff0c;有些用户在使用“轻点唤醒”功能唤醒屏幕时&#xff0c;遇到该功能失灵&#xff0c;无法正常唤醒屏幕的情况&#xff0c;这是怎么回…

Windows系统搭建Gitblit服务器

目录 介绍安装Java环境配置环境变量 下载Gitbilt配置Gitbilt 介绍 GitBlit是一个用于搭建和管理Git服务器的开源工具。它是使用Java语言编写的&#xff0c;并且需要Java环境来运行。 1、跨平台性&#xff1a;Java是一种具有跨平台性的编程语言&#xff0c;可以在多个操作系统…

读取xml

将json文件读取成字符串 public static String getJsonStr(File jsonFile){try {FileReader fileReader new FileReader(jsonFile);Reader reader new InputStreamReader(new FileInputStream(jsonFile),"utf-8");int ch 0;StringBuffer sb new StringBuffer();…

【工具】VirtualBox虚拟机安装Windows操作系统

前面的文章中介绍了VirtualBox虚拟机的安装,VirtualBox虚拟机中如何安装操作系统,是本文的重点,下面将进行详细介绍。 使用VirtualBox虚拟机安装Windows操作系统有很多好处,主要包括以下几点: 节省资源:通过虚拟化技术,一台物理计算机可以同时运行多个虚拟机,每个虚拟…

【Terraform学习】使用 Terraform 将 EC2 实例作为 Web 服务器启动(Terraform-AWS最佳实战学习)

使用 Terraform 将 EC2 实例作为 Web 服务器启动 实验步骤 前提条件 安装 Terraform&#xff1a; 地址 下载仓库代码模版 本实验代码位于 task_ec2 文件夹中。 变量文件 variables.tf 在上面的代码中&#xff0c;您将声明&#xff0c;aws_access_key&#xff0c;aws_secr…

使用ImageMagick实现多张图片拼接为gif(多线程版)

官网: https://imagemagick.org/ 直接上代码 ExecutorService es Executors.newFixedThreadPool(10); List<File> images getImageFiles(sceneDir); CountDownLatch cdl new CountDownLatch(images.size()); // 拷贝图片 for (File file : images) {System.out.prin…

Web3 游戏七月洞察:迈向主流采用的临界点?

作者: lesleyfootprint.network 2023 年 7 月&#xff0c;Web3 游戏领域出现了小幅增长&#xff0c;但对于许多项目来说&#xff0c;用户采用仍然是一个持续的挑战。根据 Footprint Analytics 的数据&#xff0c;活跃的区块链游戏数量略有增加&#xff0c;达到 2,471 个。然而…

容器化微服务:用Kubernetes实现弹性部署

随着云计算的迅猛发展&#xff0c;容器化和微服务架构成为了构建现代应用的重要方式。而在这个过程中&#xff0c;Kubernetes&#xff08;常简称为K8s&#xff09;作为一个开源的容器编排平台&#xff0c;正在引领着容器化微服务的部署和管理革命。本文将深入探讨容器化微服务的…

C++ 好用的格式化库--fmt

背景 fmt 库是一个开源的 C 格式化库&#xff0c;它提供了一种简洁、安全和高效的方式来进行字符串格式化。该库的设计目标是提供与 Python 的字符串格式化语法类似的功能&#xff0c;同时保持 C 的类型安全性和性能。 下载与安装 官网下载 fmt 官网地址&#xff1a;https:…

elementUI自定义上传文件 前端后端超详细过程

下面是使用Element UI自定义上传文件的前后端详细过程&#xff1a; 前端过程&#xff1a; 引入Element UI组件库&#xff1a;在前端项目中引入Element UI库&#xff0c;可以通过CDN引入或者通过npm安装并导入。 创建上传组件&#xff1a;在前端代码中创建一个上传组件&#x…

opencv 进阶17-使用K最近邻和比率检验过滤匹配(图像匹配)

K最近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;和比率检验&#xff08;Ratio Test&#xff09;是在计算机视觉中用于特征匹配的常见技术。它们通常与特征描述子&#xff08;例如SIFT、SURF、ORB等&#xff09;一起使用&#xff0c;以在图像中找到相似…

Git相关命令

SSH密钥文件 Github里面S设置SH公钥有两者选择方式 账号下的每个仓库都设置一个公钥&#xff0c;因为GitHub官方要求每个仓库的公钥都不能相同&#xff0c;所以每个账号都要搞一个密钥&#xff08;很麻烦&#xff09;给账号分配一个公钥&#xff0c;然后这个公钥就可以在这个…

如何将pdf文件转换成word文档?

如何将pdf文件转换成word文档&#xff1f;PDF文档是我们日常办公中最为常用的电子文档格式的文件&#xff0c;也是在会议、教育培训以及商业营销中经常使用的文档格式。所以说PDF文档的功能较强&#xff0c;且应用场景较多。但是也有例外的时候&#xff0c;比如我们需要将PDF文…

Vue的五种方法实现加减乘除运算

五种方法的详细说明&#xff1a; 计算属性&#xff08;Computed Properties&#xff09;&#xff1a; 计算属性是Vue.js提供的一种便捷的属性&#xff0c;它根据依赖的数据动态计算出一个新的值。计算属性的值会被缓存&#xff0c;只有当依赖的数据发生变化时&#xff0c;才会…

前端面试总结心得

1.放在HTML里的哪一部分JavaScripts会在页面加载的时候被执行&#xff1f; A、文件头部位置&#xff1b;B、文件尾&#xff1b;C、<head>标签部分&#xff1b;D、<body>标签部分 &#xff08;正确答案D&#xff09; 2.队列和栈的区别是什么&#xff1f; 答案&am…

python判断ip所属地区 python 判断ip 网段

前言 IP地址是互联网中唯一标识一个设备的地址&#xff0c;有时候需要判断一个IP地址所属的地区&#xff0c;这就需要用到IP地址归属查询。本文将介绍Python如何通过IP地址查询所属地区并展示代码。 一、 IP地址归属查询 IP地址归属查询又称IP地址归属地查询、IP地址归属地定…

框架分析(2)-React

框架分析&#xff08;2&#xff09;-React 专栏介绍React核心思想关键特性和功能组件化开发单向数据流JSX语法强大的生态系统 优缺点分析优点缺点 专栏介绍 link 主要对目前市面上常见的框架进行分析和总结&#xff0c;希望有兴趣的小伙伴们可以看一下&#xff0c;会持续更新的…