【大数据 clickhouse】clickhouse 数据字典使用详解

news2024/12/23 23:56:19

一、数据字典介绍

数据字典是ClickHouse提供一种非常简单且实用的存储媒介,他以键值和属性映射的形式定义数据。字典中的数据会主动或被动加载到内存并支持动态更新。由于字典数据常驻内存的特性,所以非常适合保存常量或经常使用的维度表数据,从而避免不必要的JOIN查询。

数据字典分为内置与扩展两种形式,内置字典顾名思义就是ClickHouse 默认自带的字典,而外部字典是用户通过自定义配置实现的字典,也叫扩展字典。

正常情况下,字典中的数据只能通过字典函数访问(ClickHouse设置了一类字典函数,专门用于字典数据的取用)。但是也有一种例外,那就是使用特殊的字典表引擎,在字典表引擎的帮助下,可以将数据字典挂载到一张代理的数据表下,从而实现数据表与字典数据的JOIN查询。

1.1  内置字典

ClickHouse目前只有一种内置字典:Yandex.Metrica字典,从名称上来看,这个字典是ClickHouse自家产品上的字典,而他设计目的是快速存取地理数据。较为遗憾的是,由于版权原因,Yandex并没有将geo地理数据开放出来。这意味着,ClickHouse目前的内置字典只是提供了定义机制和取数的函数,所以内置字典的现状较为尴尬,需要遵循它的规范自行导入数据,由于现实工作中使用场景很少,只做了解即可。

1.2  外部扩展字典

外部扩展字典是以插件的形式注册到ClickHouse中,由用户自定义数据模式以及数据来源,目前扩展字典支持7种类型的内存布局和4类数据来源,性比内置字典,扩展字典才是更适合更多的业务场景。

接下来,将重点介绍常用的外部扩展字典的使用。

二、 前置准备

数据准备

在clickhouse安装完成后,配置文件默认在 : /etc/clickhouse-server 目录下,进入到该目录,有一个config.xml的文件;

通过grep 命令,查找当前配置文件,找到 dictionaries_config 这样一个标签所在的位置;

默认的情况下,ClickHouse会自动识别并加 载/etc/clickhouse-server目录下所有以_dictionary.xml结尾的配置 文件。同时ClickHouse也能够动态感知到此目录下配置文件的各种变 化,并支持不停机在线更新配置文件

所以,接下来我们只需要将测试数据的定义放在/etc/clickhouse-server目录下即可;

准备3个csv文件

各个文件中内容如下

 

完整的配置结构如下所示

如果在/etc/clickhouse-server 目录下自定义字典,需要编写一个以dictionary.xml格式的文件,文件的格式大致遵循如下格式;

<?xml version="1.0"?> 
<dictionaries>
       <dictionary>
              <name>
                     dict_name
              </name>
              <structure> 
                     <!—字典的数据结构 --> 
              </structure>
              <layout> 
                     <!—在内存中的数据格式类型 --> 
              </layout>
              <source> 
                     <!—数据源配置 --> 
              </source>
              <lifetime> 
                     <!—字典的自动更新频率 --> 
              </lifetime>
       </dictionary>
</dictionaries>

 三、外部扩展字典使用

(1)文件类型

数据字典在加载数据时,根据文件的来源不同,又可以细分为本地文件,可执行文件,和远程文件,它们是最易使用也是最直接的数据源,很适合在静态数据这类场景中使用;

本地文件

本地文件使用file这个标签元素进行定义,其中path表示数据文件的绝对路径,而format表示数据文件的格式,比如CSV格式等,完整的配置结构如下:

            <source>
                     <file>
                            <path>/etc/clickhouse-server/datas/organization.csv</path>
                            <format>CSV</format>
                     </file>
              </source>

可执行文件

可执行文件数据源属于本地文件的变种,需要通过cat 命令访问数据文件。对于cache和complex_key_cache类型的字典,必须使用此类型的文件数据源。可执行文件使用executable标签元素定义。其中,command表示数据文件的绝对路径,format表示数据格式,完整配置如下:

        <source>
            <executable>
                <command>cat /etc/clickhouse-server/datas/organization.csv</command>
                <format>CSV</format>
            </executable>
        </source>

远程文件

远程文件与可执行文件类似,只是将cat命令替换成了post请求,支持http与https两种协议,远程文件使用http标签元素定义,其中url表示远程数据的访问地址,format标签表示数据格式,完整配置如下:

        <source>
            <http>
                <url>http://IP/organization.csv</command>
                <format>CSV</format>
            </http>
        </source>

接下来,先详细说明下在clickhouse中如何加载本地文件到数据字典的;

(2)七种扩展字典类型的配置使用

扩展字典的类型使用layout元素定义,目前共有7种类型。一个字典的 类型,既决定了其数据在内存中的存储结构,也决定了该字典支持的key键 类型。根据key键类型的不同,可以将它们划分为两类:

  • 单数值key类型(flat、 hashed、range_hashed和cache);
  • 复合key类型(complex_key_hashed、complex_key_cache和 ip_trie);

3.1  flat类型

flat类型的字典是所有类型中性能最高的类型,它只能使用UInt64数值型 key。flat类型的字典数据在内存中使用数组结构保存。数组的初始 大小为1024,上限为500000,这意味着它最多只能保存500000行数据。如果在创建字典时数据量超出其上限,那么字典会创建失败。

在/etc/clickhouse- server 目录下创建一个flat类型的配置文件

<?xml version="1.0"?>
<dictionaries>
       <dictionary>
              <name>flat_dict</name>
              <source>
                     <!-- 加载上一步提前准备好的测试csv数据 -->
                     <file>
                            <path>/etc/clickhouse-server/datas/organization.csv</path>
                            <format>CSV</format>
                     </file>
              </source>
              <layout>
                     <flat/>
              </layout>
              <!-- 与测试csv数据的字段结构对应上 -->
              <structure>
                     <id>
                            <name>id</name>
                     </id>
                     <attribute>
                            <name>code</name>
                            <type>String</type>
                            <null_value/>
                     </attribute>
                     <attribute>
                            <name>name</name>
                            <type>String</type>
                            <null_value/>
                     </attribute>
              </structure>
              <lifetime>
                     <min>300</min>
                     <max>360</max>
              </lifetime>
       </dictionary>
</dictionaries>

保存之后不需要重启clickhouse服务,直接使用下面的sql查询,可以看到已经作为字典表加载进去了;

SELECT name, type, key, attribute.names, attribute.types FROM system.dictionaries;

 使用下面的sql查询字典表的数据,如下要查找 flat_dict这个字典中id为1的code字段的数据;

select dictGet('flat_dict','code',toUInt64(1));

查询出的结果正好就是上面机构csv中的id为1的code值

查找系统中的字典表相关信息

select * from system.dictionaries;

3.2  hashed类型

hashed字典同样只能够使用UInt64数值型key,但与flat字典不同的 是,hashed字典的数据在内存中通过散列结构保存,且没有存储上限的制约。

在当前目录新增一个 org_hashed_dictionary.xml 的文件,配置如下内容:

<?xml version="1.0"?>
<dictionaries>
    <dictionary>
        <name>org_hashed_dictionary</name>
        <source>
            <file>
                <path>/etc/clickhouse-server/datas/organization.csv</path>
                <format>CSV</format>
            </file>
        </source>
        <layout>
            <hashed/>
        </layout>
        <structure>
            <id>
                <name>id</name>
            </id>
            <attribute>
                <name>code</name>
                <type>String</type>
                <null_value/>
            </attribute>
            <attribute>
                <name>name</name>
                <type>String</type>
                <null_value/>
            </attribute>
        </structure>
        <lifetime>
            <min>300</min>
            <max>360</max>
        </lifetime>
    </dictionary>
</dictionaries>

3.3  range_hashed 类型

range_hashed字典可看作hashed字典的变种,它在原有功能的基础上 增加了指定时间区间的特性,数据会以散列结构存储并按照时间排序。时间区间通过range_min和range_max元素指定,所指定的字段必须是Date或者 DateTime类型。

在当前目录新增一个 sale_range_dictionary.xml 的文件,配置如下内容:

<?xml version="1.0"?>
<dictionaries>
    <dictionary>
        <name>range_hashed_dict</name>
        <source>
            <file>
                <path>/etc/clickhouse-server/datas/sales.csv</path>
                <format>CSV</format>
            </file>
        </source>
        <layout>
            <range_hashed/>
        </layout>
        <structure>
            <id>
                <name>id</name>
            </id>
            <range_min>
                <name>start</name>
            </range_min>
            <range_max>
                <name>end</name>
            </range_max>
            <attribute>
                <name>price</name>
                <type>Float32</type>
                <null_value/>
            </attribute>
        </structure>
        <lifetime>
            <min>300</min>
            <max>360</max>
        </lifetime>
    </dictionary>
</dictionaries>

仍然使用上面的sql可以查询到上面加载到系统中的字典表

3.4  cache类型

cache字典只能够使用UInt64数值型key,它的字典数据在内存中会通过 固定长度的向量数组保存。定长的向量数组又称cells,它的数组长度由 size_in_cells指定。而size_in_cells的取值大小必须是2的整数倍,如若 不是,则会自动向上取为2的倍数的整数。

cache字典取数逻辑与其他字典有所不同,它并不会一次性将所有数 据载入内存。当从cache字典中获取数据时,首先会在cells数组中检查该数据是否已经被缓存过。如果没有被缓存,才会从源头加载数据并缓存到cells中。所以cache字典是性能最不稳定的字典,因为它的性能优劣完 全取决于缓存的命中率(缓存命中率=命中次数/查询次数),如果无法做到 99%或者更高的缓存命中率,则最好不要使用此类型。

在当前目录新增一个 cache_dictionary.xml的文件,配置如下内容:

<?xml version="1.0"?>
<dictionaries>
    <dictionary>
        <name>cache_dict</name>
        <source>
          	<!-- 本地文件需要通过 executable形式 -->
            <executable>
                <command>cat /etc/clickhouse-server/datas/organization.csv</command>
                <format>CSV</format>
            </executable>
        </source>
        <layout>
            <cache>
              	<!-- 缓存大小 -->
                <size_in_cells>10000</size_in_cells>
            </cache>
        </layout>
        <structure>
            <id>
                <name>id</name>
            </id>
            <attribute>
                <name>code</name>
                <type>String</type>
                <null_value/>
            </attribute>
            <attribute>
                <name>name</name>
                <type>String</type>
                <null_value/>
            </attribute>
        </structure>
        <lifetime>
            <min>300</min>
            <max>360</max>
        </lifetime>
    </dictionary>
</dictionaries>

仍然使用上面的sql可以查询到上面加载到系统中的字典表

关于cells的取值可以根据实际情况考虑,在内存宽裕的情况下设 置成1000000000也是可行的。还有一点需要注意,如果cache字典使用本地 文件作为数据源,则必须使用executable的形式设置。

3.5  complex_key_hashed 类型

complex_key_hashed字典在功能方面与hashed字典完全相同,只是将单 个数值型key替换成了复合型

在当前目录新增一个 complex_dictionary.xml的文件,配置如下内容:

<?xml version="1.0"?>
<dictionaries>
    <dictionary>
        <name>complex_key_hashed_dict</name>
        <source>
            <file>
                <path>/etc/clickhouse-server/datas/organization.csv</path>
                <format>CSV</format>
            </file>
        </source>
        <layout>
            <complex_key_hashed/>
        </layout>
        <structure>
            <!-- 复合型key -->
            <key>
                <attribute>
                    <name>id</name>
                    <type>UInt64</type>
                </attribute>
                <attribute>
                    <name>code</name>
                    <type>String</type>
                </attribute>
            </key>
            <attribute>
                <name>name</name>
                <type>String</type>
                <null_value/>
            </attribute>
        </structure>
        <lifetime>
            <min>300</min>
            <max>360</max>
        </lifetime>
    </dictionary>
</dictionaries>

仍然使用上面的sql可以查询到上面加载到系统中的字典表

3.6  complex_key_cache 类型

在当前目录新增一个 complex_key_cache_dictionary.xml的文件,配置如下内容:

<?xml version="1.0"?>
<dictionaries>
    <dictionary>
        <name>complex_key_cache_dict</name>
        <source>
            <executable>
                <command>cat /etc/clickhouse-server/datas/organization.csv</command>
                <format>CSV</format>
            </executable>
        </source>
        <layout>
            <complex_key_cache>
                <size_in_cells>10000</size_in_cells>
            </complex_key_cache>
        </layout>
        <structure>
          	<!-- 复合型Key -->
            <key>
                <attribute>
                    <name>id</name>
                    <type>UInt64</type>
                </attribute>
                <attribute>
                    <name>code</name>
                    <type>String</type>
                </attribute>
            </key>
            <attribute>
                <name>name</name>
                <type>String</type>
                <null_value/>
            </attribute>
        </structure>
        <lifetime>
            <min>300</min>
            <max>360</max>
        </lifetime>
    </dictionary>
</dictionaries>

3.7  ip_trie类型

虽然同为复合型key的字典,但ip_trie字典却较为特殊,因为它只能指定单个String类型的字段,用于指代IP前缀。ip_trie字典的数据在内存中使用trie树结构保存,且专门用于IP前缀查询的场景,例如通过IP前缀查询对应的ASN信息。

在当前目录新增一个 ip_trie_dictionary.xml的文件,配置如下内容:

<?xml version="1.0"?>
<dictionaries>
    <dictionary>
        <name>ip_trie_dict</name>
        <source>
            <file>
                <path>/etc/clickhouse-server/datas/asn.csv</path>
                <format>CSV</format>
            </file>
        </source>
        <layout>
            <ip_trie/>
        </layout>
        <structure>
          	<!-- 虽然是复合类型,但是只能设置单个String类型的字段 -->
            <key>
                <attribute>
                    <name>prefix</name>
                    <type>String</type>
                </attribute>
            </key>
            <attribute>
                <name>asn</name>
                <type>String</type>
                <null_value/>
            </attribute>
            <attribute>
                <name>country</name>
                <type>String</type>
                <null_value/>
            </attribute>
        </structure>
        <lifetime>
            <min>300</min>
            <max>360</max>
        </lifetime>
    </dictionary>
</dictionaries>

在上面列举的这些字典中,flat、hashed和range_hashed依次拥有最高的性能,因此优先推荐使用,而cache性能最不稳定,不推荐使用

以上详细介绍了如何使用本地文件作为数据源字典加载数据的过程

(3)使用数据库的表数据作为字典数据源

相比文件类型,数据库类型的数据源更适合在正式的生产环境中使用。目前扩展字典支持MySQL、 ClickHouse本身及MongoDB三种数据库。

从mysql作为数据源操作

创建测试表

create table t_organization(

	`id` int(11) NOT NULL AUTO_INCREMENT,
	`code` varchar(64) DEFAULT NULL,
	`name` varchar(64) DEFAULT NULL,
	`updatetime` datetime DEFAULT NULL,
	PRIMARY KEY(`id`)
) ENGINE=INNODB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

导入两条测试数据

INSERT INTO `db_test`.`t_organization`(`id`, `code`, `name`, `updatetime`) VALUES (1, 'a001', '研发部', '2022-12-18 10:23:39');
INSERT INTO `db_test`.`t_organization`(`id`, `code`, `name`, `updatetime`) VALUES (2, 'a001', '产品部', '2022-12-17 10:24:05');

完成上面的准备之后,在当前的目录下,创建一个mysql_dictionary.xml的配置文件,内容如下:

<?xml version="1.0"?>
<dictionaries>
    <dictionary>
        <name>mysql_dict</name>
        <source>
            <mysql>
                <port>3312</port>
                <user>root</user>
                <password>XXX<password/>
                <replica>
                    <host>你的数据库连接IP地址</host>
                    <priority>1</priority>
                </replica>
                <db>db_test</db>
                <table>t_organization</table>
                <!--
                <where>id=1</where>-->
                <invalidate_query>select updatetime from t_organization where id = 8</invalidate_query>
            </mysql>
        </source>
        <layout>
            <flat/>
        </layout>
        <structure>
            <id>
                <name>id</name>
            </id>
            <attribute>
                <name>code</name>
                <type>String</type>
                <null_value/>
            </attribute>
            <attribute>
                <name>name</name>
                <type>String</type>
                <null_value/>
            </attribute>
            <attribute>
                <name>updatetime</name>
                <type>DateTime</type>
                <null_value/>
            </attribute>
        </structure>
        <lifetime>
            <min>300</min>
            <max>360</max>
        </lifetime>
    </dictionary>
</dictionaries>

当然,这里也提供下面这种方式,以供参考,有兴趣的同学可以操作一下;

-- clickhouse 使用mysql作为dict字典表
-- mysql
CREATE TABLE ch_dict.dict_demo(
    id  bigint(20)PRIMARY KEY,
    value_1 varchar(400),
    value_2 varchar(400)
);
insert into dict_demo values (1,'v1','v2');
insert into dict_demo values (2,'vv1','vv2');


-- clickhouse 
CREATE DICTIONARY dict.dict_demo (
    id UInt64,
    value_1 String DEFAULT '',
    value_2 String DEFAULT ''
)
PRIMARY KEY id
SOURCE(MYSQL(
    port 3306
    user 'root'
    password 'xxx'
    replica(host 'mysql_host_address' priority 1)
    db 'ch_dict'
    table 'dict_demo'
    invalidate_query 'select id from ch_dict.dict_demo where 1=0'
    fail_on_connection_loss 'true'
))
LAYOUT(HASHED())
LIFETIME(MIN 1 MAX 10);
SELECT * FROM dict_demo;
SELECT dictGet('dict_demo', 'value_1', 2);

从clickhouse作为数据源操作

顾名思义,数据字典中的数据来源于clickhouse自身的表,在当前目录下创建clickhouse_dictionary.xml的配置文件,首先需要创建一张数据表作为字典的数据来源;

创建测试表并写入测试数据

CREATE TABLE t_organization ( 
  ID UInt64,
	Code String,
	Name String, 
  UpdateTime DateTime
) ENGINE = TinyLog;
--写入测试数据
INSERT INTO t_organization VALUES
(1,'a0001','研发部',NOW()),
(2,'a0002','产品部' ,NOW()),
(3,'a0003','数据部',NOW());

 

配置clickhouse_dictionary.xml

<?xml version="1.0"?>
<dictionaries>
    <dictionary>
        <name>test_dict</name>
        <source>
            <clickhouse>
                <host>你的clickhouse所在IP</host>
                <port>9000</port>
                <user>default</user>
                <password>密码<password/>
                <db>datasets</db>
                <table>t_organization</table>
                <!--
                <where>id=10</where>-->
              	<!-- 指定一条SQL语句,用于在数据更新时判断是否需要更新,非必填项 -->
                <invalidate_query>SELECT UpdateTime FROM t_organization WHERE ID = 1</invalidate_query>
            </clickhouse>
        </source>
        <layout>
            <flat/>
        </layout>
        <!--大小写敏感,需要与数据表字段对应-->
        <structure>
            <id>
                <name>ID</name>
            </id>
            <attribute>
                <name>Code</name>
                <type>String</type>
                <null_value/>
            </attribute>
            <attribute>
                <name>Name</name>
                <type>String</type>
                <null_value/>
            </attribute>
            <attribute>
                <name>UpdateTime</name>
                <type>DateTime</type>
                <null_value/>
            </attribute>
        </structure>
        <lifetime>
            <min>300</min>
            <max>360</max>
        </lifetime>
    </dictionary>
</dictionaries>

从mongodb作为数据源操作

clickhouse也提供了从mongodb作为数据源将数据导入到clickhouse的字典表中,在当前目录下创建mongodb_dictionary.xml文件,配置如下:

<?xml version="1.0"?>
<dictionaries>
    <dictionary>
        <name>mongodb_dict</name>
        <source>
            <mongodb>
                <host>你的mongoIP</host>
                <port>27017</port>
                <user>用户名<user/>
                <password密码><password/>
                <db>test_db</db>
                <collection>t_organization</collection>
            </mongodb>
        </source>
        <layout>
            <flat/>
        </layout>
        <structure>
            <id>
                <name>id</name>
            </id>
            <attribute>
                <name>code</name>
                <type>String</type>
                <null_value/>
            </attribute>
            <attribute>
                <name>name</name>
                <type>String</type>
                <null_value/>
            </attribute>
        </structure>
        <lifetime>
            <min>300</min>
            <max>360</max>
        </lifetime>
    </dictionary>
</dictionaries>

 四、扩展字典的常用操作

当数据集字典数据加载完成后,接下来就是针对数据字典表的各种操作和使用了

数据查询

正常情况下,字典数据只能通过字典函数获取,例如下面的语句就使用到了 dictGet('dict_name','attr_name',key)函数

SELECT dictGet('flat_dict', 'name', toUInt64(1));

如果字典使用了复合型key,则需要使用元组作为参数传入:

SELECT dictGet('ip_trie_dict', 'asn', tuple(IPv4StringToNum('82.118.230.0')));

除了dictGet函数之外,ClickHouse还提供了一系列以dictGet为前缀的字典函 数,如下所示:

  • 获取整型数据的函数: dictGetUInt8、dictGetUInt16、dictGetUInt32、 dictGetUInt64、dictGetInt8、dictGetInt16、dictGetInt32、dictGetInt64;
  • 获取浮点数据的函数:dictGetFloat32、dictGetFloat64;
  • 获取日期数据的函数:dictGetDate、dictGetDateTime;
  • 获取字符串数据的函数:dictGetString、dictGetUUID;

字典表操作

除了通过字典函数读取数据之外,ClickHouse还提供了另外一种借助字典表的形式来读取数据。字典表是使用Dictionary表引擎的数据表(即上文中创建的那个字典表)

建表语句如下

CREATE TABLE test_flat_dict (
	id UInt64,
	code String,
	name String
) ENGINE = Dictionary(flat_dict);

那么通过这张表,就能查询到字典中的数据

使用DDL查询创建字典

从19.17.4.11版本开始,clickhouse开始支持使用DDL查询创建数据字典,如下:

CREATE DICTIONARY test_dict(
	id UInt64,
  value String
 )
PRIMARY KEY id
LAYOUT(FLAT())
SOURCE(FILE(PATH '/usr/bin/cat' FORMAT TabSeparated))
LIFETIME(1);

字典引擎 Dictionary

Dictionary表引擎是数据字典的一层代理封装,它可以取代字典函数,让用户通过数据表查询字典。字典内的数据被加载后,会全部保存到内存中,所以使用 Dictionary表对字典性能不会有任何影响。

test_flat_dict等同于数据字典flat_dict的代理表,现在对它使用 SELECT语句进行查询

如果字典数量很多,逐一为它们创建各自的Dictionary表就过于烦琐。这时可以使用Dictionary引擎类型的数据库来解决这个问题,例如:

CREATE DATABASE my_test_dictionaries ENGINE = Dictionary;

 

上述语句创建了一个名为my_test_dictionaries的数据库,它使用了Dictionary 类型的引擎。在这个数据库中,ClickHouse会自动为每个字典分别创建它们的 Dictionary表,这时候如果使用下面的sql进行查询,可以看到之前已经创建的那些字典表都被纳入到当前的这个数据字典所在的库下了;

SELECT
    database,
    name,
    engine_full
FROM system.tables
WHERE database = 'my_test_dictionaries';

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

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

相关文章

没想到H5也是黑灰产的攻击重点?

近几年&#xff0c;在数字化与疫情的推动下&#xff0c;越来越多的企业开辟了线上业务&#xff0c;在互联网上通过各种方式开展业务。线上业务不仅使得企业效率提升&#xff0c;同时也面临着被黑灰产攻击的风险。黑灰产通过各种业务漏洞&#xff0c;能够攫取大量利益&#xff0…

[附源码]计算机毕业设计Python公共台账管理系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

mysql的优化---定位低效率执行SQL-慢查询日志

-- 查看慢日志配置信息 show variables like %slow_query_log%-- 开启慢日志查询 set global slow_query_log 1-- 查看慢日志记录SQL的最低阈值时间,默认如果SQL的执行时间>10秒的&#xff0c;则算慢查询&#xff0c;则会将该操作记录到慢日志中去 show variables like lon…

文本生成项目(基于tensorflow1.14版本)

项目下载链接&#xff1a;链接: https://pan.baidu.com/s/1OfICplwlEtRBz_ta7Nwyyg?pwdyr5c 提取码: yr5c 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v4的分享 1.模型代码&#xff1a;model.py # -*- coding: utf-8 -*- # file: m…

Qemu中SylixOS与VMware中Linux的通信链路搭建

1.适用范围 在与客户沟通交流后&#xff0c;ECSM管理Linux端docker及Linux与SylixOS间通信也成了客户比较关心的一部分。因此为了能够更好地给客户提供演示&#xff0c;必然需要搭建一套具有ECSM、SylixOS、linux的环境。 如果通过硬件搭建&#xff0c;一是携带麻烦&#xff0…

表哥推荐python自学书籍:从入门到精通,读这十本书就够了!

前言 人生苦短&#xff0c;我学python。 python编程语言在各种榜单上经常拿到前列位置&#xff0c;在全球范围内都非常受欢迎。 Python作为一种不受局限、跨平台的开源编程语言&#xff0c;其数据处理速度快、功能强大且简单易学。而且&#xff0c;Python采用解释运行的方式…

风电机组的预测性维护应该如何进行?

一、应用背景 风能是最重要的清洁能源之一&#xff0c;大力发展风电等清洁能源是实现国家可持续发展战略的必然选择。发展风电、光伏等新能源的高效运维技术已成为当前电力系统面临的重要问题之一。在风电机组单机容量较大、机组整体结构越来越复杂、各部件之间的耦合也愈加紧…

零基础入门智能射频——偶极子天线等效电路模型分析

1.前言 无人机的安全防范和管控&#xff0c;已经成为无人机行业的重点内容。无人机探测解决方案已经变得非常重要。前面系列文章给出了针对无人机侦察和干扰无人机的天线阵设计&#xff0c;上一期文章中&#xff0c;我们给出一种小型化的无人机侦测天线&#xff0c;每个阵元都…

GIS开发入坑(四)--QGIS导入POI数据并实现简单处理分析

POI数据&#xff0c;英文全称Point of Intersesting&#xff0c;中文的意思是兴趣点&#xff0c;指的是在地图上有意义的点&#xff1a;比如商店、酒吧、加油站、医院、车站等。POI数据能够赋能时空行为、城市规划、地理信息等研究&#xff0c;因此获取准而全的POI数据是开展科…

ChatGPT:你才是编译器!你全家都是编译器!

我是不是再也不需要编译器了&#xff1f;&#xff01;这个故事的灵感来自一个类似的文章&#xff1a;在 ChatGPT 中构建虚拟机。我印象深刻并决定尝试类似的东西&#xff0c;但这次不是 Linux 命令行工具&#xff0c;而是让 ChatGPT 成为我们的 Python 编译器。这是初始化 Chat…

论文投稿指南——中文核心期刊推荐(数学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

如何制作HTML网页设计【体育运动主题网站——中国篮球NBA】

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

中文社区面对面|明晚8点,CTO带你上手Jina产品!

文章导读 中文社区面对面是 Jina AI 在今年7月首次推出的栏目&#xff0c;旨在为社区用户提供支持并倾听用户的反馈&#xff0c;以帮助开发者更快速地了解 Jina 生态&#xff0c;更轻松地构建和部署自己的多模态应用&#xff0c;同时也帮助我们更好地提升产品的使用体验。第五期…

【Python机器学习】全连接层与非线性回归、防止过拟合方法的讲解及实战( 附源码)

需要全部代码请点赞关注收藏后评论区留言私信&#xff5e;&#xff5e;&#xff5e; 全连接层与非线性回归 基于全连接层构建的多层神经网络能够用来完成回归和分类人物&#xff0c;在神经网络中一般用下图所示画法来表示神经元模型&#xff0c;神经元由输入层和输出层组成&am…

SPI协议详解

SPI协议详解前言一、SPI简介二、接口三、SPI总线个特点&#xff1a;&#xff08;一&#xff09;主从模式&#xff08;二&#xff09;同步传输&#xff08;三&#xff09;全双工串行通信&#xff08;数据传输高位在前&#xff0c;低位在后&#xff09;四、SPI总线传输的4种模式&…

[附源码]计算机毕业设计Python贵港高铁站志愿者服务平台(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

分词并显示词性jieba.posseg.cut()

【小白从小学Python、C、Java】【计算机等级考试500强双证书】 【Python-数据分析】 分词并显示词性 jieba.posseg.cut() [太阳]选择题 以下python代码结果错误的一项是? import jieba.posseg as pseg words pseg.cut("我爱北京天安门") for word, flag in words: …

【docker】Comopse安装

Compose安装 1、下载 2、授权 Compose初体验 地址&#xff1a;Try Docker Compose | Docker Documentation 1、应用app.py 2、DockerFile 应用打包为镜像 3、Docker-compose yaml文件&#xff08;定义整个服务&#xff0c;需要的环境&#xff0c;web、redis&#xff09;完…

从输入URL到渲染的完整过程

浏览器有一个重要的安全策略&#xff0c;称之为「同源策略」 其中&#xff0c;源协议主机端口&#xff0c;**两个源相同&#xff0c;称之为同源&#xff0c;两个源不同&#xff0c;称之为跨源或跨域 同源策略是指&#xff0c;若页面的源和页面运行过程中加载的源不一致时&…

[附源码]Nodejs计算机毕业设计江西婺源旅游文化推广系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…