doris:导入时实现数据转换

Doris 在数据导入时提供了强大的数据转换能力,可以简化部分数据处理流程,减少对额外 ETL 工具的依赖。主要支持以下四种转换方式:

  • 列映射:将源数据列映射到目标表的不同列。

  • 列变换:使用函数和表达式对源数据进行实时转换。

  • 前置过滤:在列映射和列变换前过滤掉不需要的原始数据。

  • 后置过滤:在列映射和列变换后数据对最终结果进行过滤。

通过这些内置的数据转换功能,可以提高导入效率,并确保数据处理逻辑的一致性。

导入语法​

Stream Load​

通过在 HTTP header 中设置以下参数实现数据转换:

参数说明
columns指定列映射和列变换
where指定后置过滤

注意: Stream Load 不支持前置过滤。

示例:

curl --location-trusted -u user:passwd \-H "columns: k1, k2, tmp_k3, k3 = tmp_k3 + 1" \-H "where: k1 > 1" \-T data.csv \http://<fe_ip>:<fe_http_port>/api/example_db/example_table/_stream_load

Broker Load​

在 SQL 语句中通过以下子句实现数据转换:

子句说明
column list指定列映射,格式为 (k1, k2, tmp_k3)
SET指定列变换
PRECEDING FILTER指定前置过滤
WHERE指定后置过滤

示例:

LOAD LABEL test_db.label1
(DATA INFILE("s3://bucket_name/data.csv")INTO TABLE `test_tbl`(k1, k2, tmp_k3)PRECEDING FILTER k1 = 1SET (k3 = tmp_k3 + 1)WHERE k1 > 1
)
WITH S3 (...);

Routine Load​

在 SQL 语句中通过以下子句实现数据转换:

子句说明
COLUMNS指定列映射和列变换
PRECEDING FILTER指定前置过滤
WHERE指定后置过滤

示例:

CREATE ROUTINE LOAD test_db.label1 ON test_tblCOLUMNS(k1, k2, tmp_k3, k3 = tmp_k3 + 1),PRECEDING FILTER k1 = 1,WHERE k1 > 1...

Insert Into​

Insert Into 可以直接在 SELECT 语句中完成数据转换,使用 WHERE 子句实现数据过滤。

列映射​

列映射用于定义源数据列与目标表列之间的对应关系,能够处理以下场景:

  • 源数据与目标表的列顺序不一致
  • 源数据与目标表的列数量不匹配

调整列顺序​

假设有以下源数据(表头列名仅为方便表述,实际并无表头):

列1,列2,列3,列4
1,100,beijing,1.1
2,200,shanghai,1.2
3,300,guangzhou,1.3
4,\N,chongqing,1.4

目标表有 k1, k2, k3, k4 四列,要实现如下映射:

列1 -> k1
列2 -> k3
列3 -> k2
列4 -> k4

创建目标表​
CREATE TABLE example_table
(k1 INT,k2 STRING,k3 INT,k4 DOUBLE
) ENGINE = OLAP
DUPLICATE KEY(k1)
DISTRIBUTED BY HASH(k1) BUCKETS 1;

导入数据​
  • Stream Load
curl --location-trusted -u user:passwd \-H "column_separator:," \-H "columns: k1,k3,k2,k4" \-T data.csv \-X PUT \http://<fe_ip>:<fe_http_port>/api/example_db/example_table/_stream_load

  • Broker Load
LOAD LABEL example_db.label_broker
(DATA INFILE("s3://bucket_name/data.csv")INTO TABLE example_tableCOLUMNS TERMINATED BY ","(k1, k3, k2, k4)
)
WITH s3 (...);

  • Routine Load
CREATE ROUTINE LOAD example_db.example_routine_load ON example_table
COLUMNS(k1, k3, k2, k4),
COLUMNS TERMINATED BY ","
FROM KAFKA (...);

查询结果​
mysql> select * from example_table;
+------+-----------+------+------+
| k1   | k2        | k3   | k4   |
+------+-----------+------+------+
|    2 | shanghai  |  200 |  1.2 |
|    4 | chongqing | NULL |  1.4 |
|    3 | guangzhou |  300 |  1.3 |
|    1 | beijing   |  100 |  1.1 |
+------+-----------+------+------+

源文件列数量多于表列数​

假设有以下源数据(表头列名仅为方便表述,实际并无表头):

列1,列2,列3,列4
1,100,beijing,1.1
2,200,shanghai,1.2
3,300,guangzhou,1.3
4,\N,chongqing,1.4

目标表有 k1, k2, k3 三列,而源文件包含四列数据。我们只需要源文件的第1、第2、第4列,映射关系如下:

列1 -> k1
列2 -> k2
列4 -> k3

要跳过源文件中的某些列,只需在列映射时使用任意不存在于目标表的列名。这些列名可以自定义,不受限制,导入时会自动忽略这些列的数据。

创建示例表​
CREATE TABLE example_table
(k1 INT,k2 STRING,k3 DOUBLE
) ENGINE = OLAP
DUPLICATE KEY(k1)
DISTRIBUTED BY HASH(k1) BUCKETS 1;

导入数据​
  • Stream Load
curl --location-trusted -u usr:passwd \-H "column_separator:," \-H "columns: k1,k2,tmp_skip,k3" \-T data.csv \http://<fe_ip>:<fe_http_port>/api/example_db/example_table/_stream_load

  • Broker Load
LOAD LABEL example_db.label_broker
(DATA INFILE("s3://bucket_name/data.csv")INTO TABLE example_tableCOLUMNS TERMINATED BY ","(tmp_k1, tmp_k2, tmp_skip, tmp_k3)SET (k1 = tmp_k1,k2 = tmp_k2,k3 = tmp_k3)
)
WITH s3 (...);

  • Routine Load
CREATE ROUTINE LOAD example_db.example_routine_load ON example_table
COLUMNS(k1, k2, tmp_skip, k3),
PROPERTIES
("format" = "csv","column_separator" = ","
)
FROM KAFKA (...);

注意:示例中的 tmp_skip 可以替换为任意名称,只要这些名称不在目标表的列定义中即可。

查询结果​
mysql> select * from example_table;
+------+------+------+
| k1   | k2   | k3   |
+------+------+------+
|    1 | 100  |  1.1 |
|    2 | 200  |  1.2 |
|    3 | 300  |  1.3 |
|    4 | NULL |  1.4 |
+------+------+------+

源文件列数量少于表列数​

假设有以下源数据(表头列名仅为方便表述,实际并无表头):

列1,列2,列3,列4
1,100,beijing,1.1
2,200,shanghai,1.2
3,300,guangzhou,1.3
4,\N,chongqing,1.4

目标表有 k1, k2, k3, k4, k5 五列,而源文件包含四列数据。我们只需要源文件的第1、第2、第3、第4列,映射关系如下:

列1 -> k1
列2 -> k3
列3 -> k2
列4 -> k4
k5 使用默认值

创建示例表​
CREATE TABLE example_table
(k1 INT,k2 STRING,k3 INT,k4 DOUBLE,k5 INT DEFAULT 2
) ENGINE = OLAP
DUPLICATE KEY(k1)
DISTRIBUTED BY HASH(k1) BUCKETS 1;

导入数据​
  • Stream Load
curl --location-trusted -u user:passwd \-H "column_separator:," \-H "columns: k1,k3,k2,k4" \-T data.csv \http://<fe_ip>:<fe_http_port>/api/example_db/example_table/_stream_load

  • Broker Load
LOAD LABEL example_db.label_broker
(DATA INFILE("s3://bucket_name/data.csv")INTO TABLE example_tableCOLUMNS TERMINATED BY ","(tmp_k1, tmp_k3, tmp_k2, tmp_k4)SET (k1 = tmp_k1,k3 = tmp_k3,k2 = tmp_k2,k4 = tmp_k4)
)
WITH s3 (...);

  • Routine Load
CREATE ROUTINE LOAD example_db.example_routine_load ON example_table
COLUMNS(k1, k3, k2, k4),
COLUMNS TERMINATED BY ","
FROM KAFKA (...);

说明:

  • 如果 k5 列有默认值,将使用默认值填充
  • 如果 k5 列是可空列(nullable)但没有默认值,将填充 NULL 值
  • 如果 k5 列是非空列且没有默认值,导入会失败
查询结果​
mysql> select * from example_table;
+------+-----------+------+------+------+
| k1   | k2        | k3   | k4   | k5   |
+------+-----------+------+------+------+
|    1 | beijing   |  100 |  1.1 |    2 |
|    2 | shanghai  |  200 |  1.2 |    2 |
|    3 | guangzhou |  300 |  1.3 |    2 |
|    4 | chongqing | NULL |  1.4 |    2 |
+------+-----------+------+------+------+

列变换​

列变换功能允许用户对源文件中列值进行变换,支持使用绝大部分内置函数。列变换操作通常是和列映射一起定义的,即先对列进行映射,再进行变换。

将源文件中的列值经变换后导入表中​

假设有以下源数据(表头列名仅为方便表述,实际并无表头):

列1,列2,列3,列4
1,100,beijing,1.1
2,200,shanghai,1.2
3,300,guangzhou,1.3
4,\N,chongqing,1.4

表中有 k1,k2,k3,k4 4 列,导入映射和变换关系如下:

列1       -> k1
列2 * 100 -> k3
列3       -> k2
列4       -> k4

创建示例表​
CREATE TABLE example_table
(k1 INT,k2 STRING,k3 INT,k4 DOUBLE
)
ENGINE = OLAP
DUPLICATE KEY(k1)
DISTRIBUTED BY HASH(k1) BUCKETS 1;

导入数据​
  • Stream Load
curl --location-trusted -u user:passwd \-H "column_separator:," \-H "columns: k1, tmp_k3, k2, k4, k3 = tmp_k3 * 100" \-T data.csv \http://host:port/api/example_db/example_table/_stream_load

  • Broker Load
LOAD LABEL example_db.label1
(DATA INFILE("s3://bucket_name/data.csv")INTO TABLE example_tableCOLUMNS TERMINATED BY ","(k1, tmp_k3, k2, k4)SET (k3 = tmp_k3 * 100)
)
WITH s3 (...);

  • Routine Load
CREATE ROUTINE LOAD example_db.example_routine_load ON example_table
COLUMNS(k1, tmp_k3, k2, k4, k3 = tmp_k3 * 100),
COLUMNS TERMINATED BY ","
FROM KAFKA (...);

查询结果​
mysql> select * from example_table;
+------+-----------+-------+------+
| k1   | k2        | k3    | k4   |
+------+-----------+-------+------+
|    1 | beijing   | 10000 |  1.1 |
|    2 | shanghai  | 20000 |  1.2 |
|    3 | guangzhou | 30000 |  1.3 |
|    4 | chongqing |  NULL |  1.4 |
+------+-----------+-------+------+

通过 case when 函数,有条件的进行列变换​

假设有以下源数据(表头列名仅为方便表述,实际并无表头):

列1,列2,列3,列4
1,100,beijing,1.1
2,200,shanghai,1.2
3,300,guangzhou,1.3
4,\N,chongqing,1.4

表中有 k1,k2,k3,k4 4 列。对于源数据中 beijing, shanghai, guangzhou, chongqing 分别转换为对应的地区 id 后导入:

列1                  -> k1
列2                  -> k2
列3 进行地区id转换后    -> k3
列4                  -> k4

创建示例表​
CREATE TABLE example_table
(k1 INT,k2 INT,k3 INT,k4 DOUBLE
)
ENGINE = OLAP
DUPLICATE KEY(k1)
DISTRIBUTED BY HASH(k1) BUCKETS 1;

导入数据​
  • Stream Load
curl --location-trusted -u user:passwd \-H "column_separator:," \-H "columns: k1, k2, tmp_k3, k4, k3 = CASE tmp_k3 WHEN 'beijing' THEN 1 WHEN 'shanghai' THEN 2 WHEN 'guangzhou' THEN 3 WHEN 'chongqing' THEN 4 ELSE NULL END" \-T data.csv \http://host:port/api/example_db/example_table/_stream_load

  • Broker Load
LOAD LABEL example_db.label1
(DATA INFILE("s3://bucket_name/data.csv")INTO TABLE example_tableCOLUMNS TERMINATED BY ","(k1, k2, tmp_k3, k4)SET (k3 = CASE tmp_k3 WHEN 'beijing' THEN 1 WHEN 'shanghai' THEN 2 WHEN 'guangzhou' THEN 3 WHEN 'chongqing' THEN 4 ELSE NULL END)
)
WITH s3 (...);

  • Routine Load
CREATE ROUTINE LOAD example_db.example_routine_load ON example_table
COLUMNS(k1, k2, tmp_k3, k4, k3 = CASE tmp_k3 WHEN 'beijing' THEN 1 WHEN 'shanghai' THEN 2 WHEN 'guangzhou' THEN 3 WHEN 'chongqing' THEN 4 ELSE NULL END),
COLUMNS TERMINATED BY ","
FROM KAFKA (...);

查询结果​
mysql> select * from example_table;
+------+------+------+------+
| k1   | k2   | k3   | k4   |
+------+------+------+------+
|    1 |  100 |    1 |  1.1 |
|    2 |  200 |    2 |  1.2 |
|    3 |  300 |    3 |  1.3 |
|    4 | NULL |    4 |  1.4 |
+------+------+------+------+

源文件中的 NULL 值处理​

假设有以下源数据(表头列名仅为方便表述,实际并无表头):

列1,列2,列3,列4
1,100,beijing,1.1
2,200,shanghai,1.2
3,300,guangzhou,1.3
4,\N,chongqing,1.4

表中有 k1,k2,k3,k4 4 列。在对地区 id 转换的同时,对于源数据中 k1 列的 null 值转换成 0 导入:

列1                      -> k1
列2 如果为null 则转换成0   -> k2
列3                      -> k3
列4                      -> k4

创建示例表​
CREATE TABLE example_table
(k1 INT,k2 INT,k3 INT,k4 DOUBLE
)
ENGINE = OLAP
DUPLICATE KEY(k1)
DISTRIBUTED BY HASH(k1) BUCKETS 1;

导入数据​
  • Stream Load
curl --location-trusted -u user:passwd \-H "column_separator:," \-H "columns: k1, tmp_k2, tmp_k3, k4, k2 = ifnull(tmp_k2, 0), k3 = CASE tmp_k3 WHEN 'beijing' THEN 1 WHEN 'shanghai' THEN 2 WHEN 'guangzhou' THEN 3 WHEN 'chongqing' THEN 4 ELSE NULL END" \-T data.csv \http://host:port/api/example_db/example_table/_stream_load

  • Broker Load
LOAD LABEL example_db.label1
(DATA INFILE("s3://bucket_name/data.csv")INTO TABLE example_tableCOLUMNS TERMINATED BY ","(k1, tmp_k2, tmp_k3, k4)SET (k2 = ifnull(tmp_k2, 0),k3 = CASE tmp_k3 WHEN 'beijing' THEN 1 WHEN 'shanghai' THEN 2 WHEN 'guangzhou' THEN 3 WHEN 'chongqing' THEN 4 ELSE NULL END)
)
WITH s3 (...);

  • Routine Load
CREATE ROUTINE LOAD example_db.example_routine_load ON example_table
COLUMNS(k1, tmp_k2, tmp_k3, k4, k2 = ifnull(tmp_k2, 0), k3 = CASE tmp_k3 WHEN 'beijing' THEN 1 WHEN 'shanghai' THEN 2 WHEN 'guangzhou' THEN 3 WHEN 'chongqing' THEN 4 ELSE NULL END),
COLUMNS TERMINATED BY ","
FROM KAFKA (...);

查询结果​
mysql> select * from example_table;
+------+------+------+------+
| k1   | k2   | k3   | k4   |
+------+------+------+------+
|    1 |  100 |    1 |  1.1 |
|    2 |  200 |    2 |  1.2 |
|    3 |  300 |    3 |  1.3 |
|    4 |    0 |    4 |  1.4 |
+------+------+------+------+

前置过滤​

前置过滤是在数据转换前对原始数据进行过滤的功能,可以提前过滤掉不需要处理的数据,减少后续处理的数据量,提高导入效率。该功能仅支持 Broker Load 和 Routine Load 两种导入方式。 前置过滤有以下应用场景:

  • 转换前做过滤

希望在列映射和转换前做过滤的场景,能够先行过滤掉部分不需要的数据。

  • 过滤列不存在于表中,仅作为过滤标识

比如源数据中存储了多张表的数据(或者多张表的数据写入了同一个 Kafka 消息队列)。数据中每行有一列表名来标识该行数据属于哪个表。用户可以通过前置过滤条件来筛选对应的表数据进行导入。

示例​

假设有以下源数据(表头列名仅为方便表述,实际并无表头):

列1,列2,列3,列4
1,100,beijing,1.1
2,200,shanghai,1.2
3,300,guangzhou,1.3
4,\N,chongqing,1.4

前置过滤条件为:

列1>1,即只导入 列1>1 的数据,其他数据过滤掉。

创建示例表​
CREATE TABLE example_table
(k1 INT,k2 INT,k3 STRING,k4 DOUBLE
)
ENGINE = OLAP
DUPLICATE KEY(k1)
DISTRIBUTED BY HASH(k1) BUCKETS 1;

导入数据​
  • Broker Load
LOAD LABEL example_db.label1
(DATA INFILE("s3://bucket_name/data.csv")INTO TABLE example_tableCOLUMNS TERMINATED BY ","(k1, k2, k3, k4)PRECEDING FILTER k1 > 1
)
WITH s3 (...);

  • Routine Load
CREATE ROUTINE LOAD example_db.example_routine_load ON example_table
COLUMNS(k1, k2, k3, k4),
COLUMNS TERMINATED BY ","
PRECEDING FILTER k1 > 1
FROM KAFKA (...)

查询结果​
mysql> select * from example_table;
+------+------+-----------+------+
| k1   | k2   | k3        | k4   |
+------+------+-----------+------+
|    2 |  200 | shanghai  |  1.2 |
|    3 |  300 | guangzhou |  1.3 |
|    4 | NULL | chongqing |  1.4 |
+------+------+-----------+------+

后置过滤​

后置过滤在数据转换后执行,可以根据转换后的结果进行过滤。

在列映射和转换缺省的情况下,直接过滤​

假设有以下源数据(表头列名仅为方便表述,实际并无表头):

列1,列2,列3,列4
1,100,beijing,1.1
2,200,shanghai,1.2
3,300,guangzhou,1.3
4,\N,chongqing,1.4

表中有 k1,k2,k3,k4 4 列,在缺省列映射和转换的情况下,只导入源文件中第 4 列为大于 1.2 的数据行。

创建示例表​
CREATE TABLE example_table
(k1 INT,k2 INT,k3 STRING,k4 DOUBLE
)
ENGINE = OLAP
DUPLICATE KEY(k1)
DISTRIBUTED BY HASH(k1) BUCKETS 1;

导入数据​
  • Stream Load
curl --location-trusted -u user:passwd \-H "column_separator:," \-H "columns: k1, k2, k3, k4" \-H "where: k4 > 1.2" \-T data.csv \http://host:port/api/example_db/example_table/_stream_load

  • Broker Load
LOAD LABEL example_db.label1
(DATA INFILE("s3://bucket_name/data.csv")INTO TABLE example_tableCOLUMNS TERMINATED BY ","(k1, k2, k3, k4)where k4 > 1.2
)
WITH s3 (...);

  • Routine Load
CREATE ROUTINE LOAD example_db.example_routine_load ON example_table
COLUMNS(k1, k2, k3, k4),
COLUMNS TERMINATED BY ","
WHERE k4 > 1.2;
FROM KAFKA (...)

查询结果​
mysql> select * from example_table;
+------+------+-----------+------+
| k1   | k2   | k3        | k4   |
+------+------+-----------+------+
|    3 |  300 | guangzhou |  1.3 |
|    4 | NULL | chongqing |  1.4 |
+------+------+-----------+------+

对经过列变换的数据进行过滤​

假设有以下源数据(表头列名仅为方便表述,实际并无表头):

列1,列2,列3,列4
1,100,beijing,1.1
2,200,shanghai,1.2
3,300,guangzhou,1.3
4,\N,chongqing,1.4

表中有 k1,k2,k3,k4 4 列。在列变换示例中,我们将省份名称转换成了 id。这里我们希望过滤掉 id 为 3 的数据

创建示例表​
CREATE TABLE example_table
(k1 INT,k2 INT,k3 INT,k4 DOUBLE
)
ENGINE = OLAP
DUPLICATE KEY(k1)
DISTRIBUTED BY HASH(k1) BUCKETS 1;

导入数据​
  • Stream Load
curl --location-trusted -u user:passwd \-H "column_separator:," \-H "columns: k1, k2, tmp_k3, k4, k3 = case tmp_k3 when 'beijing' then 1 when 'shanghai' then 2 when 'guangzhou' then 3 when 'chongqing' then 4 else null end" \-H "where: k3 != 3" \-T data.csv \http://host:port/api/example_db/example_table/_stream_load

  • Broker Load
LOAD LABEL example_db.label1
(DATA INFILE("s3://bucket_name/data.csv")INTO TABLE example_tableCOLUMNS TERMINATED BY ","(k1, k2, tmp_k3, k4)SET (k3 = CASE tmp_k3 WHEN 'beijing' THEN 1 WHEN 'shanghai' THEN 2 WHEN 'guangzhou' THEN 3 WHEN 'chongqing' THEN 4 ELSE NULL END)WHERE k3 != 3
)
WITH s3 (...); 

  • Routine Load
CREATE ROUTINE LOAD example_db.example_routine_load ON example_table
COLUMNS(k1, k2, tmp_k3, k4),
COLUMNS TERMINATED BY ","
SET (k3 = CASE tmp_k3 WHEN 'beijing' THEN 1 WHEN 'shanghai' THEN 2 WHEN 'guangzhou' THEN 3 WHEN 'chongqing' THEN 4 ELSE NULL END
)
WHERE k3 != 3;
FROM KAFKA (...)

查询结果​
mysql> select * from example_table;
+------+------+------+------+
| k1   | k2   | k3   | k4   |
+------+------+------+------+
|    1 |  100 |    1 |  1.1 |
|    2 |  200 |    2 |  1.2 |
|    4 | NULL |    4 |  1.4 |
+------+------+------+------+

多条件过滤​

假设有以下源数据(表头列名仅为方便表述,实际并无表头):

列1,列2,列3,列4
1,100,beijing,1.1
2,200,shanghai,1.2
3,300,guangzhou,1.3
4,\N,chongqing,1.4

表中有 k1,k2,k3,k4 4 列。过滤掉 k1 列为 null 的数据,同时过滤掉 k4 列小于 1.2 的数据

创建示例表​
CREATE TABLE example_table
(k1 INT,k2 INT,k3 STRING,k4 DOUBLE
)
ENGINE = OLAP
DUPLICATE KEY(k1)
DISTRIBUTED BY HASH(k1) BUCKETS 1;

导入数据​
  • Stream Load
curl --location-trusted -u user:passwd \-H "column_separator:," \-H "columns: k1, k2, k3, k4" \-H "where: k1 is not null and k4 > 1.2" \-T data.csv \http://host:port/api/example_db/example_table/_stream_load

  • Broker Load
LOAD LABEL example_db.label1
(DATA INFILE("s3://bucket_name/data.csv")INTO TABLE example_tableCOLUMNS TERMINATED BY ","(k1, k2, k3, k4)where k1 is not null and k4 > 1.2
)
WITH s3 (...);

  • Routine Load
CREATE ROUTINE LOAD example_db.example_routine_load ON example_table
COLUMNS(k1, k2, k3, k4),
COLUMNS TERMINATED BY ","
WHERE k1 is not null and k4 > 1.2
FROM KAFKA (...);

查询结果​
mysql> select * from example_table;
+------+------+-----------+------+
| k1   | k2   | k3        | k4   |
+------+------+-----------+------+
|    3 |  300 | guangzhou |  1.3 |
|    4 | NULL | chongqing |  1.4 |
+------+------+-----------+------+

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

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

相关文章

python学opencv|读取图像(五十四)使用cv2.blur()函数实现图像像素均值处理

【1】引言 前序学习进程中&#xff0c;对图像的操作均基于各个像素点上的BGR值不同而展开。 对于彩色图像&#xff0c;每个像素点上的BGR值为三个整数&#xff0c;因为是三通道图像&#xff1b;对于灰度图像&#xff0c;各个像素上的BGR值是一个整数&#xff0c;因为这是单通…

【开源免费】基于Vue和SpringBoot的工作流程管理系统(附论文)

本文项目编号 T 193 &#xff0c;文末自助获取源码 \color{red}{T193&#xff0c;文末自助获取源码} T193&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

IntelliJ IDEA远程开发代理远程服务器端口(免费内网穿透)

IntelliJ IDEA远程开发代理远程服务器端口&#xff08;免费内网穿透&#xff09;&#xff08;JetBrains家的其他IDE应该也支持&#xff09; 之前看到宇宙第一IDE VS Code好像默认代理了远程的端口&#xff0c;但是一直没找到IDEA的同类功能&#xff0c;这次终于发现了 以Intell…

文字显示省略号

多行文本溢出显示省略号

STM32_SD卡的SDIO通信_DMA读写

本篇&#xff0c;将使用CubeMXKeil&#xff0c;创建一个SD卡的DMA读写工程。 目录 一、简述 二、CubeMX 配置 SDIO DMA 三、Keil 编辑代码 四、实验效果 实现效果&#xff0c;如下图&#xff1a; 一、简述 上篇已简单介绍了SD、SDIO&#xff0c;本篇不再啰嗦&#xff0c;…

智能小区物业管理系统推动数字化转型与提升用户居住体验

内容概要 在当今快速发展的社会中&#xff0c;智能小区物业管理系统的出现正在改变传统的物业管理方式。这种系统不仅仅是一种工具&#xff0c;更是一种推动数字化转型的重要力量。它通过高效的技术手段&#xff0c;将物业管理与用户居住体验紧密结合&#xff0c;无疑为社区带…

基于STM32景区环境监测系统的设计与实现(论文+源码)

1系统方案设计 根据系统功能的设计要求&#xff0c;展开基于STM32景区环境监测系统设计。如图2.1所示为系统总体设计框图。系统以STM32单片机作为系统主控模块&#xff0c;通过DHT11传感器、MQ传感器、声音传感器实时监测景区环境中的温湿度、空气质量以及噪音数据。系统监测环…

八. Spring Boot2 整合连接 Redis(超详细剖析)

八. Spring Boot2 整合连接 Redis(超详细剖析) 文章目录 八. Spring Boot2 整合连接 Redis(超详细剖析)2. 注意事项和细节3. 最后&#xff1a; 在 springboot 中 , 整合 redis 可以通过 RedisTemplate 完成对 redis 的操作, 包括设置数据/获取数据 比如添加和读取数据 具体整…

【Unity3D】Tilemap俯视角像素游戏案例

目录 一、导入Tilemap 二、导入像素风素材 三、使用Tilemap制作地图 3.1 制作Tile Palette素材库 3.2 制作地图 四、实现A*寻路 五、待完善 一、导入Tilemap Unity 2019.4.0f1 已内置Tilemap 需导入2D Sprite、2D Tilemap Editor、以及一个我没法正常搜出的2D Tilemap…

企微SCRM驱动企业私域流量营销与客户关系管理的智慧革新

内容概要 在当今竞争激烈的商业环境中&#xff0c;企微SCRM逐渐成为企业实现私域流量营销和优化客户关系管理的重要工具。它的出现不仅提升了企业的工作效率&#xff0c;也改变了传统的营销方式。那么&#xff0c;究竟什么是企微SCRM呢&#xff1f;简单来说&#xff0c;它是将…

数据库、数据仓库、数据湖有什么不同

数据库、数据仓库和数据湖是三种不同的数据存储和管理技术&#xff0c;它们在用途、设计目标、数据处理方式以及适用场景上存在显著差异。以下将从多个角度详细说明它们之间的区别&#xff1a; 1. 数据结构与存储方式 数据库&#xff1a; 数据库主要用于存储结构化的数据&…

前端力扣刷题 | 6:hot100之 矩阵

73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 法一&#xff1a; var setZeroes function(matrix) {let setX new Set(); // 用于存储需要置零的行索引let setY new Set(); //…

【编译系列】Torch.compile()训练编译——算子融合逻辑 工程化

1. 背景: torch.compile()中,Dynamo作为前端负责计算图的捕获,后端有inductor、tvm等进行编译优化。 Dynamo:在Python字节码层面注入pass,实现bytecode-to-bytecode的优化,通过对bytecode逐行进行解析构建FX GraphInductor:负责对FX Graph进行AOTAutograd生成joint-gra…

Docker 部署教程jenkins

Docker 部署 jenkins 教程 Jenkins 官方网站 Jenkins 是一个开源的自动化服务器&#xff0c;主要用于持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;过程。它帮助开发人员自动化构建、测试和部署应用程序&#xff0c;显著提高软件开发的效率和质量…

2025/2/3 云服务器数据库与idea相连

幸福就摆在你面前&#xff0c;你却把阴影当成山川瀑布&#xff0c;你说你无法幸福。 轻量应用服务器https://swasnext.console.aliyun.com/servers/cn-heyuanhttps://swasnext.console.aliyun.com/servers/cn-heyuanhttps://swasnext.console.aliyun.com/servers/cn-heyuanhttp…

【memgpt】letta 课程1/2:从头实现一个自我编辑、记忆和多步骤推理的代理

llms-as-operating-systems-agent-memory llms-as-operating-systems-agent-memory内存 操作系统的内存管理

6. 【Vue实战--孢子记账--Web 版开发】-- 主币种设置

从这篇文章开始我们将一起实现孢子记账的功能&#xff0c;这篇文章实现主币种设置。这个功能比较简单&#xff0c;因此我们从这个功能开始做。 一、功能 根据项目前期的需求调研&#xff0c;用户需要在设置主币种的时候查看汇率信息&#xff08;别问为什么有这么个需求&#…

51单片机(STC89C52)开发:点亮一个小灯

软件安装&#xff1a; 安装开发板CH340驱动。 安装KEILC51开发软件&#xff1a;C51V901.exe。 下载软件&#xff1a;PZ-ISP.exe 创建项目&#xff1a; 新建main.c 将main.c加入至项目中&#xff1a; main.c:点亮一个小灯 #include "reg52.h"sbit LED1P2^0; //P2的…

GESP2023年9月认证C++六级( 第三部分编程题(2)小杨的握手问题)

参考程序1&#xff08;暴力枚举&#xff09; #include <iostream> using namespace std;int main() {int n 0;cin >> n; // 读入同学的数量int num[300000]; // 存储同学的学号for (int i 0; i < n; i) {cin >> num[i]; // 读入同学的进入顺序}long…

【C++篇】哈希表

目录 一&#xff0c;哈希概念 1.1&#xff0c;直接定址法 1.2&#xff0c;哈希冲突 1.3&#xff0c;负载因子 二&#xff0c;哈希函数 2.1&#xff0c;除法散列法 /除留余数法 2.2&#xff0c;乘法散列法 2.3&#xff0c;全域散列法 三&#xff0c;处理哈希冲突 3.1&…