Flink之Catalog

Catalog

  • Catalog
    • 概述
    • Catalog分类
  • GenericInMemoryCatalog
  • JdbcCatalog
    • 下载JAR包及使用
    • 重启操作
    • 创建Catalog
    • 查看与使用Catalog
    • 自动初始化catalog
  • HiveCatalog
    • 下载JAR包及使用
    • 重启操作
    • hive metastore服务
    • 创建Catalog
    • 查看与使用Catalog
    • Flink与Hive中操作
    • 自动初始化catalog
  • 用户自定义Catalog
    • 实现Catalog
    • 使用Catalog
  • Catalog API
    • 数据库操作
    • 表操作
    • 视图操作
    • 分区操作
    • 函数操作

Catalog

概述

Catalog提供了元数据信息,例如数据库、表、分区、视图以及数据库或其他外部系统中存储的函数和信息。

数据处理最关键的方面之一是管理元数据。 元数据可以是临时的,例如临时表、或者通过TableEnvironment注册的 UDF。 元数据也可以是持久化的,例如Hive Metastore中的元数据。

Catalog提供了一个统一的API,用于管理元数据,并使其可以从Table API和SQL查询语句中来访问。

Catalog分类

在Flink中,Catalog可以分为4类:GenericInMemoryCatalogJdbcCatalogHiveCatalog用户自定义Catalog

1.GenericInMemoryCatalog

GenericInMemoryCatalog是基于内存实现的 Catalog,所有元数据只在 session 的生命周期内可用。

2.JdbcCatalog

JdbcCatalog使得用户可以将Flink通过JDBC协议连接到关系数据库。Postgres Catalog和MySQL Catalog是目前 JDBC Catalog仅有的两种实现。

3.HiveCatalog

HiveCatalog有两个用途:作为原Flink元数据的持久化存储,以及作为读写现有Hive元数据的接口。

Hive Metastore以小写形式存储所有元数据对象名称。而GenericInMemoryCatalog区分大小写。

4.用户自定义Catalog

Catalog是可扩展的,用户可以通过实现Catalog接口来开发自定义Catalog。 想要在SQL CLI中使用自定义 Catalog,用户除了需要实现自定义的Catalog 之外,还需要为这个Catalog实现对应的CatalogFactory接口。

CatalogFactory定义了一组属性,用于SQL CLI启动时配置Catalog。 这组属性集将传递给发现服务,在该服务中,服务会尝试将属性关联到CatalogFactory并初始化相应的Catalog 实例。

GenericInMemoryCatalog

基于内存实现的Catalog,所有元数据只在session的生命周期(一个Flink任务运行生命周期内)内可用。默认自动创建名为default_catalog的内存Catalog,这个Catalog默认只有一个名为default_database的数据库。

JdbcCatalog

JdbcCatalog使得用户可以将 Flink 通过 JDBC 协议连接到关系数据库。Postgres Catalog和MySQL Catalog是目前仅有的两种JDBC Catalog实现,将元数据存储在数据库中。

这里以JdbcCatalog-MySQL使用为例。

注意:JdbcCatalog不支持建表,只是打通flink与mysql的连接,可以去读写mysql现有的库表。

下载JAR包及使用

下载:flink-connector-jdbc

下载:mysql-connector-j

上传JAR包到flink/lib

cp ./flink-connector-jdbc-3.1.0-1.17.jar /usr/local/program/flink/libcp ./mysql-connector-j-8.0.33.jar /usr/local/program/flink/lib

重启操作

重启flink集群和sql-client

bin/start-cluster.shbin/sql-client.sh

创建Catalog

JdbcCatalog支持以下选项:

name:必需,Catalog名称default-database:连接到的默认数据库username: Postgres/MySQL帐户的用户名password:帐号密码base-url:数据库的jdbc url(不含数据库名)Postgres Catalog:是"jdbc:postgresql://<ip>:<端口>"MySQL Catalog:是"jdbc: mysql://<ip>:<端口>"
CREATE CATALOG jdbc_catalog WITH('type' = 'jdbc','default-database' = 'demo','username' = 'root','password' = '123456','base-url' = 'jdbc:mysql://node01:3306'
);

查看与使用Catalog

查看Catalog

Flink SQL> show catalogs;
+-----------------+
|    catalog name |
+-----------------+
| default_catalog |
|    jdbc_catalog |
+-----------------+
2 rows in set

使用指定Catalog

Flink SQL> use catalog jdbc_catalog;
[INFO] Execute statement succeed.

查看当前的CATALOG

Flink SQL> SHOW CURRENT CATALOG;
+----------------------+
| current catalog name |
+----------------------+
|         jdbc_catalog |
+----------------------+
1 row in set

操作数据库表

Flink SQL> show current database;
+-----------------------+
| current database name |
+-----------------------+
|                  demo |
+-----------------------+
1 row in setFlink SQL> show tables;
+------------+
| table name |
+------------+
|    tb_user |
+------------+
1 row in setFlink SQL> select * from tb_user;
[INFO] Result retrieval cancelled.Flink SQL> insert into tb_user values(0,'java',20);
[INFO] Submitting SQL update statement to the cluster...
[INFO] SQL update statement has been successfully submitted to the cluster:
Job ID: 9d78ec378ad635d291bd730ba86245d8

自动初始化catalog

进入SQL客户端自动初始化catalo,创建vim sql-client-init.sql初始化脚本

SET sql-client.execution.result-mode = 'tableau';CREATE CATALOG jdbc_catalog WITH('type' = 'jdbc','default-database' = 'demo','username' = 'root','password' = '123456','base-url' = 'jdbc:mysql://node01:3306'
);use catalog jdbc_catalog;

进入客户端时指定初始化文件

bin/sql-client.sh  -i ./sql-client-init.sql

再查看catalog

Flink SQL> show catalogs;
+-----------------+
|    catalog name |
+-----------------+
| default_catalog |
|    jdbc_catalog |
+-----------------+
2 rows in set

HiveCatalog

HiveCatalog有两个用途:

单纯作为 Flink元数据的持久化存储作为读写现有Hive元数据的接口

注意:Hive MetaStore以小写形式存储所有元数据对象名称。Hive Metastore以小写形式存储所有元对象名称,而 GenericInMemoryCatalog会区分大小写。

下载JAR包及使用

下载:flink-sql-connector-hive

下载:mysql-connector-j

上传jar包到flink的lib

cp ./flink-sql-connector-hive-2.3.9_2.12-1.17.0.jar /usr/local/program/flink/lib/cp ./mysql-connector-j-8.0.33.jar /usr/local/program/flink/lib

重启操作

重启flink集群和sql-client

bin/start-cluster.shbin/sql-client.sh

hive metastore服务

启动外置的hive metastore服务

Hive metastore必须作为独立服务运行,因此,在Hive的hive-site.xml中添加配置

  <property><name>hive.metastore.uris</name><value>thrift://node01:9083</value></property>
# 前台运行
hive --service metastore# 后台运行
hive --service metastore &

创建Catalog

创建Catalog参数说明

配置项必需默认值类型说明
typeYes(none)StringCatalog类型,创建HiveCatalog时必须设置为’hive’
nameYes(none)StringCatalog的唯一名称
hive-conf-dirNo(none)String包含hive -site.xml的目录,需要Hadoop文件系统支持。如果没指定hdfs协议,则认为是本地文件系统。如果不指定该选项,则在类路径中搜索hive-site.xml
default-databaseNodefaultStringHive Catalog使用的默认数据库
hive-versionNo(none)StringHiveCatalog能够自动检测正在使用的Hive版本。建议不要指定Hive版本,除非自动检测失败
hadoop-conf-dirNo(none)StringHadoop conf目录的路径。只支持本地文件系统路径。设置Hadoop conf的推荐方法是通过HADOOP_CONF_DIR环境变量。只有当环境变量不适合你时才使用该选项,例如,如果你想分别配置每个HiveCatalog
CREATE CATALOG myhive WITH ('type' = 'hive','default-database' = 'default','hive-conf-dir' = '/usr/local/program/hive/conf'
);

查看与使用Catalog

查看Catalog

Flink SQL> SHOW CATALOGS;
+-----------------+
|    catalog name |
+-----------------+
| default_catalog |
|          myhive |
+-----------------+
2 rows in set--查看当前的CATALOG
SHOW CURRENT CATALOG;

使用指定Catalog

Flink SQL> use catalog myhive;
[INFO] Execute statement succeed.

Flink与Hive中操作

Flink中查看

Flink SQL> SHOW DATABASES;
+---------------+
| database name |
+---------------+
|       default |
+---------------+
1 row in set

操作Hive

# 创建数据库demo
hive (default)> create database demo;# 切换数据库
hive (default)> use demo;# 创建表tb_user
hive (demo)> create table tb_user(id int,name string, age int);# 插入数据
hive (demo)> insert into tb_user values(1,"test",22);

Flink中再次查看

Flink SQL> SHOW DATABASES;
+---------------+
| database name |
+---------------+
|       default |
|          demo |
+---------------+
2 rows in setFlink SQL> use demo;
[INFO] Execute statement succeed.Flink SQL> show tables;
+------------+
| table name |
+------------+
|    tb_user |
+------------+Flink SQL> SET 'sql-client.execution.result-mode' = 'tableau';
[INFO] Execute statement succeed.Flink SQL> select * from tb_user;2023-07-09 21:58:25,620 INFO  org.apache.hadoop.mapred.FileInputFormat                     [] - Total input files to process : 1+----+-------------+--------------------------------+-------------+
| op |          id |                           name |         age |
+----+-------------+--------------------------------+-------------+
| +I |           1 |                           test |          22 |
+----+-------------+--------------------------------+-------------+
Received a total of 1 row

在Flink中插入

Flink SQL> insert into tb_user values(2,'flink',22);
[INFO] Submitting SQL update statement to the cluster...
[INFO] SQL update statement has been successfully submitted to the cluster:
Job ID: 9fe32af97cfb9e507ce84263cae65d23Flink SQL> select * from tb_user;2023-07-09 22:05:47,521 INFO  org.apache.hadoop.mapred.FileInputFormat                     [] - Total input files to process : 2+----+-------------+--------------------------------+-------------+
| op |          id |                           name |         age |
+----+-------------+--------------------------------+-------------+
| +I |           1 |                           test |          22 |
| +I |           2 |                          flink |          22 |
+----+-------------+--------------------------------+-------------+
Received a total of 2 rows

Hive中查询

hive (demo)> select * from tb_user;

自动初始化catalog

进入SQL客户端自动初始化catalog,创建vim sql-client-init.sql初始化脚本

SET sql-client.execution.result-mode = 'tableau';CREATE CATALOG myhive WITH ('type' = 'hive','default-database' = 'default','hive-conf-dir' = '/usr/local/program/hive/conf'
);use catalog myhive ;

进入客户端时指定初始化文件

bin/sql-client.sh  -i ./sql-client-init.sql

可以发现数据信息任然存在

Flink SQL> use catalog myhive;
[INFO] Execute statement succeed.Flink SQL> show databases;
+---------------+
| database name |
+---------------+
|       default |
|          demo |
+---------------+
2 rows in set

用户自定义Catalog

实现Catalog

用户可以通过实现Catalog接口来开发自定义 Catalog

public class CustomCatalog implements Catalog {public CustomCatalog(String catalogName, String defaultDatabase) {}@Overridepublic void open() {// 实现 Catalog 打开的逻辑}@Overridepublic void close() {// 实现 Catalog 关闭的逻辑}@Overridepublic List<String> listDatabases() {// 实现获取数据库列表的逻辑return null;}@Overridepublic CatalogDatabase getDatabase(String databaseName) {// 实现获取指定数据库的逻辑return null;}@Overridepublic boolean databaseExists(String databaseName) {// 实现检查数据库是否存在的逻辑return false;}@Overridepublic void createDatabase(String name, CatalogDatabase database, boolean ignoreIfExists) {// 实现创建数据库的逻辑}@Overridepublic void dropDatabase(String name, boolean ignoreIfNotExists, boolean cascade) {// 实现删除数据库的逻辑}@Overridepublic List<String> listTables(String databaseName) {// 实现获取数据库中表的列表的逻辑return null;}@Overridepublic CatalogBaseTable getTable(ObjectPath tablePath) {// 实现获取指定表的逻辑return null;}@Overridepublic boolean tableExists(ObjectPath tablePath) {// 实现检查表是否存在的逻辑return false;}@Overridepublic void createTable(ObjectPath tablePath, CatalogBaseTable table, boolean ignoreIfExists) {// 实现创建表的逻辑}@Overridepublic void dropTable(ObjectPath tablePath, boolean ignoreIfNotExists) {// 实现删除表的逻辑}@Overridepublic List<String> listFunctions(String dbName) {// 实现获取数据库中函数的逻辑return null;}// 其他方法的实现
}

使用Catalog

    public static void main(String[] args) throws Exception {StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);// 注册自定义 CatalogtableEnv.registerCatalog("my_catalog", new CustomCatalog("my_catalog", "default"));// 使用自定义 CatalogtableEnv.useCatalog("my_catalog");// 执行 SQL 查询或 Table API 操作tableEnv.sqlQuery("SELECT * FROM my_table").execute().print();}

Catalog API

数据库操作

    public static void main(String[] args) throws Exception {// 创建一个基于内存的Catalog实例GenericInMemoryCatalog catalog = new GenericInMemoryCatalog("myCatalog");catalog.open();// 创建数据库Map<String, String> properties = new HashMap<>();properties.put("key", "value");CatalogDatabase database = new CatalogDatabaseImpl(properties, "create comment");catalog.createDatabase("mydb", database, false);// 列出Catalog中的所有数据库System.out.println("列出Catalog中的所有数据库 = " + catalog.listDatabases());// 获取数据库CatalogDatabase createDb = catalog.getDatabase("mydb");System.out.println("获取数据库,comment =  " + createDb.getComment() + " ,properties = " + createDb.getProperties());// 修改数据库Map<String, String> properties2 = new HashMap<>();properties2.put("key", "value1");catalog.alterDatabase("mydb", new CatalogDatabaseImpl(properties2, "alter comment"), false);// 获取数据库CatalogDatabase alterDb = catalog.getDatabase("mydb");System.out.println("获取数据库,comment =  " + alterDb.getComment() + " ,properties = " + alterDb.getProperties());// 检查数据库是否存在System.out.println("检查数据库是否存在 = " + catalog.databaseExists("mydb"));// 删除数据库catalog.dropDatabase("mydb", false);// 关闭 Catalogcatalog.close();}
列出Catalog中的所有数据库 = [default, mydb]
获取数据库,comment =  create comment ,properties = {key=value}
获取数据库,comment =  alter comment ,properties = {key=value1}
检查数据库是否存在 = true

表操作

// 创建表
catalog.createTable(new ObjectPath("mydb", "mytable"), new CatalogTableImpl(...), false);// 删除表
catalog.dropTable(new ObjectPath("mydb", "mytable"), false);// 修改表
catalog.alterTable(new ObjectPath("mydb", "mytable"), new CatalogTableImpl(...), false);// 重命名表
catalog.renameTable(new ObjectPath("mydb", "mytable"), "my_new_table");// 获取表
catalog.getTable("mytable");// 检查表是否存在
catalog.tableExists("mytable");// 列出数据库中的所有表
catalog.listTables("mydb");

视图操作

// 创建视图
catalog.createTable(new ObjectPath("mydb", "myview"), new CatalogViewImpl(...), false);// 删除视图
catalog.dropTable(new ObjectPath("mydb", "myview"), false);// 修改视图
catalog.alterTable(new ObjectPath("mydb", "mytable"), new CatalogViewImpl(...), false);// 重命名视图
catalog.renameTable(new ObjectPath("mydb", "myview"), "my_new_view", false);// 获取视图
catalog.getTable("myview");// 检查视图是否存在
catalog.tableExists("mytable");// 列出数据库中的所有视图
catalog.listViews("mydb");

分区操作

// 创建分区
catalog.createPartition(new ObjectPath("mydb", "mytable"),new CatalogPartitionSpec(...),new CatalogPartitionImpl(...),false);// 删除分区
catalog.dropPartition(new ObjectPath("mydb", "mytable"), new CatalogPartitionSpec(...), false);// 修改分区
catalog.alterPartition(new ObjectPath("mydb", "mytable"),new CatalogPartitionSpec(...),new CatalogPartitionImpl(...),false);// 获取分区
catalog.getPartition(new ObjectPath("mydb", "mytable"), new CatalogPartitionSpec(...));// 检查分区是否存在
catalog.partitionExists(new ObjectPath("mydb", "mytable"), new CatalogPartitionSpec(...));// 列出表的所有分区
catalog.listPartitions(new ObjectPath("mydb", "mytable"));// 根据给定的分区规范列出表的分区
catalog.listPartitions(new ObjectPath("mydb", "mytable"), new CatalogPartitionSpec(...));// 根据表达式过滤器列出表的分区
catalog.listPartitions(new ObjectPath("mydb", "mytable"), Arrays.asList(epr1, ...));

函数操作

// 创建函数
catalog.createFunction(new ObjectPath("mydb", "myfunc"), new CatalogFunctionImpl(...), false);// 删除函数
catalog.dropFunction(new ObjectPath("mydb", "myfunc"), false);// 修改函数
catalog.alterFunction(new ObjectPath("mydb", "myfunc"), new CatalogFunctionImpl(...), false);// 获取函数
catalog.getFunction("myfunc");// 检查函数是否存在
catalog.functionExists("myfunc");// 列出数据库中的所有函数
catalog.listFunctions("mydb");

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

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

相关文章

基于springboot实现桥牌计分管理系统项目【项目源码】计算机毕业设计

基于springboot实现桥牌计分管理系统演示 JAVA简介 JavaScript是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&#…

MYSQL操作详解

一)计算机的基本结构 但是实际上&#xff0c;更多的是这种情况: 二)MYSQL中的数据类型: 一)数值类型: 数据类型内存大小(字节)说明bit(M)M指定位数,默认为1单个二进制位值&#xff0c;或者为0或者为1&#xff0c;主要用于开/关标志tinyint1字节1个字节的整数值&#xff0c;支持…

KITTI数据集(.bin数据)转换为点云数据(.pcd文件)

目录 cmake代码 代码 cmake代码 cmake_minimum_required(VERSION 3.17) project(TEST2)set(CMAKE_CXX_STANDARD 14)# Find PCL find_package(PCL 1.8 REQUIRED)# If PCL was found, add its include directories to the project if(PCL_FOUND)include_directories(${PCL_INC…

使用openvc进行人脸检测:Haar级联分类器

1 人脸检测介绍 1.1 什么是人脸检测 人脸检测的目标是确定图像或视频中是否存在人脸。如果存在多个面&#xff0c;则每个面都被一个边界框包围&#xff0c;因此我们知道这些面的位置 人脸检测算法的主要目标是准确有效地确定图像或视频中人脸的存在和位置。这些算法分析数据…

Unity 获取对象的方法

Unity获取对象的方法还是有不少的。 以下是一些我知道的方法。 1、GameObject.Find()&#xff1a;这是一种最简单的方法&#xff0c;可以通过对象的名称来查找对象。例如&#xff0c;GameObject.Find("Cube")&#xff1b;将返回名称为"Cube"的对象。 2、…

一文入门Springboot+actuator+Prometheus+Grafana

环境介绍 技术栈 springbootmybatis-plusmysqloracleactuatorPrometheusGrafana 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 本地主机应用 192.168.1.9:8007 PrometheusGrafana安装在同一台主机 http://…

[西湖论剑 2022]real_ez_node

文章目录 前置知识EJS模板注入&#xff08;CVE-2022-29078&#xff09;原型链污染漏洞 &#xff08;CVE-2021-25928&#xff09;HTTP响应拆分攻击&#xff08;CRLF&#xff09; 解题过程代码审计构造payload 前置知识 EJS模板注入&#xff08;CVE-2022-29078&#xff09; EJS…

.net在使用存储过程中IN参数的拼接方案,使用Join()方法

有时候拼接SQL语句时&#xff0c;可能会需要将list中的元素都加上单引号&#xff0c;并以逗号分开&#xff0c;但是Join只能简单的分开&#xff0c;没有有单引号&#xff01; 1.第一种拼接方案 List<string> arrIds new List<string>(); arrIds.Add("aa&qu…

Cross-Origin跨站问题详解(跨站请求、跨站cookie)

背景&#xff1a;我部署frontend和backend到两个不同的docker容器&#xff0c;前端路径为http://localhost:3000&#xff0c;后端路径为http://localhost:4000。我设置了用户登录功能&#xff0c;并使用cookie进行session管理。当我的前端登录时&#xff0c;创建了一个session&…

【Java 进阶篇】Java与JQuery选择器:解锁前端开发的魔法大门

在前端开发的世界中&#xff0c;选择器是我们与HTML文档进行互动的钥匙&#xff0c;而Java和JQuery则为我们提供了强大的工具&#xff0c;使得前端开发不再是一个艰深的谜题。本篇博客将围绕Java与JQuery选择器展开&#xff0c;深入解析选择器的奥秘&#xff0c;为你打开前端开…

nvdiffrast的MeshRenderer

获取输入: vertex: 顶点坐标,大小为(B, N, 3)tri: 面片索引,大小为(B, M, 3) 或 (M, 3)feat(可选): 顶点features,大小为(B, C)计算NDC(标准设备坐标)投影矩阵,用于投影到图像平面。将顶点坐标转换到同质坐标(加1维,方便后续运算)。用NDC投影矩阵将顶点坐标转换到NDC空间。创建…

C++ 模板保姆级详解——template<class T>(什么是模板?模板分哪几类?模板如何应用?)

目录 一、前言 二、 什么是C模板 &#x1f4a6;泛型编程的思想 &#x1f4a6;C模板的分类 三、函数模板 &#x1f4a6;函数模板概念 &#x1f4a6;函数模板格式 &#x1f4a6;函数模板的原理 &#x1f4a6;函数模板的实例化 &#x1f34e;隐式实例化 &#x1f349;显式实…

21. 合并两个有序链表 --力扣 --JAVA

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题思路 判断特殊情况&#xff0c;如&#xff1a;两个列表中其中一个为空&#xff1b;创建一个初始节点用于返回&#xff1b;通过while循环来逐个遍历链表&#xff0…

手把手教你 RT-DETR 添加注意力机制 | 一次性添加 20+ 种!

RT-DETR 添加注意力机制 ! 本来想多发一些自己的个人魔改,但是有些同学还是需要一些基础的注意力改进,那么大家可以先用这篇文章的代码,我同样给大家提供了很多的模板。 文章目录 RT-DETR 添加注意力机制 !注意力机制介绍注意力机制的分类1. SE 注意力模块1.1 原理1.2 代码…

【STM32】TIM2的PWM:脉冲宽度调制--标准库

注意点&#xff1a; TIM_Period---->指要进行比较的值Compare TIM_Prescaler----> 指要进行分频的值【分频值/原始时钟值】 PWM是一种周期固定&#xff0c;脉宽可调整的输出波形。 https://www.cnblogs.com/brianblog/p/7117896.html 0.通用寄存器输出 1.捕获/比较通道…

面向萌新的技术博客入门指南

Python之禅 在Python的解释器中隐藏一个彩蛋&#xff0c;输入import this就会返回19条Python之禅&#xff0c;具体如下&#xff1a; import this The Zen of Python, by Tim Peters Python之禅 &#xff0c;by Tim Peters Beautiful is better than ugly. 优美好于丑陋&…

clouldcompare工具使用

文章目录 1.界面1.1 布局1.3 视觉显示方向1.4 放大镜1.5 建立旋转中心2.快速入门2.1 剪裁2.2 多点云拼接 1.界面 1.1 布局 参考&#xff1a;https://blog.csdn.net/lovely_yoshino/article/details/129595201 1.3 视觉显示方向 1.4 放大镜 1.5 建立旋转中心 2.快速入门 2.1 …

开源:特殊的垄断

免责声明&#xff1a;本博客旨在分享我对开源策略的理解和体会&#xff0c;不代表任何组织或机构的立场或观点&#xff0c;也不构成任何商业或投资的建议或担保。本博客的内容可能存在错误或遗漏&#xff0c;也可能随着时间的推移而变得过时或不适用。请在使用或依赖本博客的内…

open clip论文阅读摘要

看下open clip论文 Learning Transferable Visual Models From Natural Language Supervision These results suggest that the aggregate supervision accessible to modern pre-training methods within web-scale collections of text surpasses that of high-quality crowd…

记录--vue3 setup 中国省市区三级联动options最简洁写法,无需任何库

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 在写页面的时候&#xff0c;发现表单里面有一个省市区的 options 组件要写&#xff0c;因为表单很多地方都会用到这个地址选择&#xff0c;我便以为很简单嘛。 虽然很简单的一个功能&#xff0c;但是网…