如何学习Doris:糙快猛的大数据之路(从入门到专家)

Doris学习之旅.png

引言:大数据世界的新玩家

还记得我第一次听说"Doris"这个名字时的情景吗?那是在一个炎热的夏日午后,我正在办公室里为接下来的大数据项目发愁。作为一个刚刚跨行到大数据领域的新手,我感觉自己就像是被丢进了深海的小鱼—周围全是陌生的概念和技术。

就在这时,我的导师拍了拍我的肩膀,说:“嘿,你听说过Doris吗?它可能是你需要的解决方案。”

我一脸茫然地看着他,心想:“Doris?这不是我奶奶的名字吗?”

于是,我的Doris学习之旅就这样开始了。今天,我想和大家分享我是如何以"糙快猛"的方式学习Doris的,希望能给同样面临学习新技术挑战的你一些启发。

目录

    • 引言:大数据世界的新玩家
    • Doris是什么?
    • 学习Doris的糙快猛之路
      • 1. 不求甚解,先跑起来
      • 2. 从简单查询开始
      • 3. 拥抱错误,快速迭代
      • 4. 利用AI助手,事半功倍
      • 总结:在不完美中前行
    • 深入Doris:从入门到进阶
      • 5. 掌握Doris的数据模型
        • 明细模型
        • 聚合模型
      • 6. 实践Doris的高级特性
        • 创建物化视图
      • 7. 性能调优:让Doris飞起来
      • 8. 融入生态:Doris的朋友们
    • 进阶之路:Doris的更多玩法
      • 9. 掌握Doris的数据导入方式
        • 批量导入
        • 实时导入
      • 10. Doris SQL的高级用法
        • 窗口函数
        • 复杂的JOIN操作
      • 11. Doris的高可用与扩展
        • FE高可用配置
        • 动态扩容
      • 12. Doris与AI的结合:预测性分析
    • 企业级应用:Doris在实战中的征程
      • 13. 企业级性能调优
        • 分区策略优化
        • 预聚合和物化视图优化
        • 合理使用索引
      • 14. Doris与数据湖的集成
      • 15. 实时数据分析案例
        • 实时数据导入
        • 实时聚合查询
      • 16. 机器学习模型部署与服务
    • Doris的未来:云原生与更多可能
      • 17. Doris与云原生的结合
        • 使用Helm部署Doris
        • 使用Operator管理Doris
      • 18. 大规模Doris集群的管理与优化
        • 自动化运维
        • 监控与告警
      • 19. Doris的安全性考虑
        • 认证与授权
        • 数据加密
      • 20. Doris的未来发展趋势
      • 21. 实战案例:全球化电商平台的数据分析
        • 需求
        • 解决方案
        • 核心SQL示例
    • Doris的多元化应用:跨行业案例研究
      • 22. 金融行业:实时风控系统
        • 需求
        • 解决方案
        • 核心实现
      • 23. 物联网(IoT):智能工厂数据分析
        • 需求
        • 解决方案
        • 核心实现
      • 24. 新零售:全渠道数据整合
        • 需求
        • 解决方案
        • 核心实现
      • 25. Doris与新兴技术的结合
        • 5G与边缘计算
        • AI与Doris的深度集成
        • 区块链数据分析
    • Doris的进阶之路:高级优化与生态系统集成
      • 26. Doris查询优化的艺术
        • 分区剪枝
        • 物化视图优化
        • 子查询优化
        • 使用EXPLAIN分析查询计划
      • 27. Doris与Hadoop生态系统的深度集成
        • 与Hive的集成
        • 与Spark的集成
        • 与Flink的集成
      • 28. Doris在复杂数据分析场景中的应用
        • 实时OLAP分析
        • 时序数据分析
        • 图数据分析
      • 29. Doris的未来:持续优化与创新
    • 结语:在技术的海洋中乘风破浪

Doris是什么?

image.png

在开始学习之前,我们先来简单了解一下Doris。

Apache Doris是一个现代化的MPP(大规模并行处理)分析型数据库,专为快速分析而生。它支持多维分析,能够处理结构化和半结构化数据,并提供亚秒级的查询响应时间。

简单来说,Doris就像是一个超级强大的Excel,可以处理海量数据,并且能快速给出你想要的分析结果。

学习Doris的糙快猛之路

1. 不求甚解,先跑起来

记得刚开始学Doris时,我看着那厚厚的文档,心里一阵发怵。但我很快想到了我的座右铭:“糙快猛,就是干!”

image.png

于是,我决定先不管那么多,把Doris安装运行起来再说。我找到了Doris的快速入门指南,照着步骤一步步来:

# 下载Doris
wget https://downloads.apache.org/doris/1.2/apache-doris-1.2.0-bin-x64.tar.gz# 解压
tar -xzvf apache-doris-1.2.0-bin-x64.tar.gz# 启动BE (Backend)
cd apache-doris-1.2.0-bin-x64/be
./bin/start_be.sh --daemon# 启动FE (Frontend)
cd ../fe
./bin/start_fe.sh --daemon

看着Doris成功启动,我兴奋地直拍大腿:“哎呀我去,这也太简单了吧!”

2. 从简单查询开始

image.png

有了运行的Doris,下一步就是尝试一些简单的操作。我决定先创建一个表,然后插入一些数据:

-- 创建数据库
CREATE DATABASE IF NOT EXISTS my_first_doris;-- 使用数据库
USE my_first_doris;-- 创建表
CREATE TABLE my_table
(user_id INT,username VARCHAR(50),signup_date DATE
)
UNIQUE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;-- 插入数据
INSERT INTO my_table VALUES
(1, 'alice', '2023-01-01'),
(2, 'bob', '2023-01-02'),
(3, 'charlie', '2023-01-03');-- 查询数据
SELECT * FROM my_table;

看到查询结果出现在屏幕上,我忍不住喊了一声:“芜湖,起飞!”
image.png

3. 拥抱错误,快速迭代

学习的过程中难免会遇到错误。记得有一次,我试图导入一个大文件,结果遇到了内存不足的问题。我没有气馁,而是迅速查阅文档,找到了解决方案:

-- 设置会话变量,增加内存限制
SET exec_mem_limit = 2147483648;  -- 设置为2GB-- 然后重新尝试导入操作
LOAD LABEL my_first_doris.label_1
(DATA INFILE("hdfs://your-hdfs-path/large_file.csv")INTO TABLE my_large_tableCOLUMNS TERMINATED BY ","
)

每解决一个问题,我都会感到一阵成就感。这种不断尝试、犯错、解决的过程,让我的学习速度突飞猛进。

4. 利用AI助手,事半功倍

在学习过程中,我发现ChatGPT等大模型可以成为24小时不打烊的助教。每当遇到不懂的概念或复杂的查询,我就会向AI提问:

“能帮我解释一下Doris中的’前缀索引’是什么吗?”

“当然,Doris中的前缀索引是一种用于加速查询的数据结构。它主要用于字符串类型的列,通过索引字符串的前缀来提高查询效率。例如,如果你有一个很长的URL列,你可以创建一个前缀索引来加速对URL开头的搜索…”

有了AI的帮助,我的学习效率大大提高,不再因为一些小问题卡住很长时间。

总结:在不完美中前行

回顾我的Doris学习之路,我深刻体会到"糙快猛"学习方法的威力。它让我能够:

  1. 快速上手,不被繁复的细节所困扰
  2. 在实践中学习,加深对知识的理解
  3. 勇于尝试,从错误中吸取教训
  4. 充分利用现代工具,如AI助手,辅助学习

记住,学习新技术不需要一开始就追求完美。在不完美的状态下前行,反而可能是最高效的学习姿势。就像我从一个对大数据一无所知的新手,逐渐成长为能够熟练使用Doris的开发者,这个过程虽然充满挑战,但也充满了乐趣。

最后,我想对所有正在学习新技术的朋友说:别怕犯错,别怕不完美。拥抱"糙快猛"的学习方式,你会发现,原来技术学习可以这么有趣,这么高效!

现在,轮到你了。准备好开始你的Doris学习之旅了吗?记住,糙快猛,就是干!

深入Doris:从入门到进阶

既然我们已经踏上了Doris学习之路,不如再深入一些,探索Doris的更多特性和应用场景。记住,我们依然保持"糙快猛"的学习态度,但同时也要逐步提升技术深度。

5. 掌握Doris的数据模型

在使用Doris一段时间后,我意识到理解其数据模型对于优化查询性能至关重要。Doris主要支持两种数据模型:明细模型和聚合模型。

明细模型

明细模型适合存储原始数据,每一行数据代表一个独立的事件或实体。例如:

CREATE TABLE user_actions
(user_id INT,action_time DATETIME,action_type VARCHAR(20),action_detail VARCHAR(100)
)
UNIQUE KEY(user_id, action_time)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;
聚合模型

聚合模型则适合存储预聚合的数据,可以大大提高查询效率。例如:

CREATE TABLE daily_user_actions
(date_of_action DATE,user_id INT,action_type VARCHAR(20),action_count BIGINT SUM DEFAULT "0"
)
AGGREGATE KEY(date_of_action, user_id, action_type)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;

理解这两种模型后,我可以根据实际需求选择合适的模型,这对于优化存储和查询效率都很有帮助。

6. 实践Doris的高级特性

学习过程中,我发现Doris还有许多强大的高级特性。比如说,Doris的物化视图功能就让我眼前一亮。
image.png

创建物化视图
CREATE MATERIALIZED VIEW mv_daily_actions AS
SELECT date_of_action, action_type, COUNT(DISTINCT user_id) AS unique_users
FROM daily_user_actions
GROUP BY date_of_action, action_type;

创建物化视图后,当我需要查询每日每种操作的独立用户数时,Doris会自动使用这个物化视图,大大提高了查询速度。

7. 性能调优:让Doris飞起来

image.png

随着数据量的增加,我开始关注如何提升Doris的性能。除了选择合适的数据模型和使用物化视图外,我还学会了一些其他的调优技巧:

  1. 合理设置分桶数:

    ALTER TABLE my_table 
    DISTRIBUTED BY HASH(user_id) BUCKETS 20;
    
  2. 使用分区:

    ALTER TABLE daily_user_actions 
    ADD PARTITION p202307 VALUES LESS THAN ("2023-08-01");
    
  3. 设置合适的副本数:

    ALTER TABLE my_table 
    MODIFY PARTITION p202307 
    SET ("replication_num" = "3");
    

这些优化措施让我的Doris集群性能有了显著提升,查询速度飞快,我心里那个小人儿又开始得意地喊:“看我把Doris玩儿明白了吧!”

8. 融入生态:Doris的朋友们

在深入学习Doris的过程中,我发现Doris并不是孤立存在的,它可以很好地与其他大数据工具协同工作。比如:

  1. 使用Flink CDC实时同步MySQL数据到Doris
  2. 通过Spark读写Doris数据
  3. 使用DataX进行数据迁移

我尝试写了一个简单的Spark程序来读取Doris数据:

import org.apache.spark.sql.SparkSessionval spark = SparkSession.builder().appName("DorisSparkReader").getOrCreate()val dorisDF = spark.read.format("doris").option("doris.table.identifier", "mydatabase.mytable").option("doris.fenodes", "fe_host:8030").load()dorisDF.show()

这段代码让我感叹:原来Doris可以这么轻松地与Spark集成!

进阶之路:Doris的更多玩法

在Doris的学习旅程中,我逐渐发现这个强大的MPP数据库系统还有很多有趣的特性和应用场景。让我们一起来探索一下Doris的更多玩法,继续我们的"糙快猛"学习之旅!

9. 掌握Doris的数据导入方式

image.png

随着项目的推进,我需要处理越来越多的数据导入任务。Doris提供了多种数据导入方式,每种都有其适用场景:

批量导入

对于大批量历史数据,我常用Stream Load:

curl --location-trusted -u root: -H "label:123" -H "column_separator:," -T data.csv http://fe_host:8030/api/example_db/example_tbl/_stream_load
实时导入

对于实时数据,我会使用Routine Load配合Kafka:

CREATE ROUTINE LOAD example_db.kafka_load ON example_tbl
COLUMNS TERMINATED BY ",",
COLUMNS(k1, k2, k3, v1, v2, v3)
PROPERTIES
("desired_concurrent_number"="3","max_batch_interval" = "20","max_batch_rows" = "300000","max_batch_size" = "209715200","strict_mode" = "false"
)
FROM KAFKA
("kafka_broker_list" = "broker1:9092,broker2:9092,broker3:9092","kafka_topic" = "my_topic","property.group.id" = "doris_consume_group","property.kafka_default_offsets" = "OFFSET_BEGINNING"
);

这段配置让我能够持续从Kafka读取数据并导入Doris,实现了近实时的数据分析。

10. Doris SQL的高级用法

随着对Doris的深入了解,我发现Doris的SQL功能非常强大,支持很多高级用法:

窗口函数

例如,计算用户行为的累计值:

SELECT user_id,action_time,action_type,SUM(action_count) OVER (PARTITION BY user_id ORDER BY action_time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_actions
FROM user_actions;
复杂的JOIN操作

Doris支持多种JOIN类型,包括SEMI JOIN和ANTI JOIN:

SELECT a.user_id, a.username
FROM users a
LEFT SEMI JOIN (SELECT user_idFROM ordersGROUP BY user_idHAVING SUM(order_amount) > 1000
) b ON a.user_id = b.user_id;

这个查询可以高效地找出总订单金额超过1000的用户。

11. Doris的高可用与扩展

image.png

在生产环境中使用Doris,高可用性和可扩展性是必不可少的。我学会了如何配置Doris集群以实现这些目标:

FE高可用配置

配置多个Follower FE以确保元数据的高可用:

ALTER SYSTEM ADD FOLLOWER "fe_host:9010";
动态扩容

当数据量增长时,我可以动态添加BE节点:

ALTER SYSTEM ADD BACKEND "be_host:9050";

这些操作让我能够根据业务需求灵活调整Doris集群的规模和性能。

12. Doris与AI的结合:预测性分析

随着AI技术的普及,我开始探索如何将Doris与机器学习模型结合,实现预测性分析。虽然Doris本身不直接支持机器学习,但我们可以通过以下方式实现:

  1. 使用Doris进行数据预处理和特征工程
  2. 将处理后的数据导出到支持机器学习的平台(如Spark MLlib)
  3. 训练模型并生成预测结果
  4. 将预测结果导回Doris进行存储和进一步分析

例如,我们可以使用Doris预处理用户行为数据,然后使用Spark训练一个简单的推荐模型:

from pyspark.sql import SparkSession
from pyspark.ml.recommendation import ALS# 创建SparkSession
spark = SparkSession.builder.appName("DorisMLPipeline").getOrCreate()# 从Doris读取数据
doris_df = spark.read \.format("doris") \.option("doris.table.identifier", "example_db.user_behaviors") \.option("doris.fenodes", "fe_host:8030") \.load()# 使用ALS算法训练推荐模型
als = ALS(maxIter=5, regParam=0.01, userCol="user_id", itemCol="item_id", ratingCol="rating")
model = als.fit(doris_df)# 生成推荐结果
predictions = model.transform(doris_df)# 将结果写回Doris
predictions.write \.format("doris") \.option("doris.table.identifier", "example_db.item_recommendations") \.option("doris.fenodes", "fe_host:8030") \.save()

这个例子展示了如何利用Doris的数据处理能力,结合Spark的机器学习功能,实现一个简单的推荐系统。

企业级应用:Doris在实战中的征程

随着我在Doris上的技能不断提升,我有幸参与了几个大型企业项目。这些经历让我对Doris在企业环境中的应用有了更深入的理解。让我们一起来看看Doris在企业级应用中的一些实战经验和高级技巧。

13. 企业级性能调优

在处理海量数据时,性能调优变得尤为重要。以下是一些我在实践中总结的调优技巧:

分区策略优化

根据业务特点选择合适的分区策略是提升性能的关键。例如,对于时间序列数据:

CREATE TABLE sales_records (sale_date DATE,product_id INT,sale_amount DECIMAL(10, 2)
)
PARTITION BY RANGE(sale_date) (PARTITION p2021 VALUES LESS THAN ("2022-01-01"),PARTITION p2022 VALUES LESS THAN ("2023-01-01"),PARTITION p2023 VALUES LESS THAN ("2024-01-01")
)
DISTRIBUTED BY HASH(product_id) BUCKETS 32;

这种分区策略允许我们快速定位和查询特定时间范围的数据。

预聚合和物化视图优化

对于常见的聚合查询,我们可以创建预聚合表或物化视图:

CREATE MATERIALIZED VIEW mv_daily_sales AS
SELECT sale_date, product_id, SUM(sale_amount) as total_sales
FROM sales_records
GROUP BY sale_date, product_id;

这样可以大大提高聚合查询的性能。

合理使用索引

Doris支持前缀索引,合理使用可以显著提升查询性能:

ALTER TABLE sales_records ADD INDEX idx_product (product_id) USING BITMAP;

14. Doris与数据湖的集成

在一个大型数据分析项目中,我们需要将Doris与Hudi数据湖集成。这涉及到了Doris的外部表功能:

CREATE EXTERNAL TABLE ext_hudi_table (id INT,name STRING,age INT,ts DATETIME
)
ENGINE=hudi
PROPERTIES ("hudi.database.name" = "default","hudi.table.name" = "hudi_table","hudi.table.type" = "COPY_ON_WRITE","hudi.streaming.read.enable" = "true","hudi.streaming.read.start.commit" = "20230101000000","hive.metastore.uris" = "thrift://localhost:9083"
);

这允许我们在Doris中直接查询Hudi数据,实现了数据湖和数据仓库的无缝集成。

15. 实时数据分析案例

在一个电商平台的实时数据分析项目中,我们使用Doris实现了近实时的销售数据分析。这涉及到了Doris的实时数据导入和快速聚合查询能力。

实时数据导入

我们使用Flink CDC来捕获MySQL中的实时订单数据,然后通过Doris的Stream Load API实时写入Doris:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();MySqlSource<String> mySqlSource = MySqlSource.<String>builder().hostname("mysql_host").port(3306).databaseList("retail_db").tableList("retail_db.orders").username("username").password("password").deserializer(new JsonDebeziumDeserializationSchema()).build();env.fromSource(mySqlSource, WatermarkStrategy.noWatermarks(), "MySQL Source").addSink(new DorisStreamLoad<>("fe_host", 8030, "retail_db", "realtime_orders"));env.execute("MySQL to Doris CDC");
实时聚合查询

然后,我们可以在Doris中进行实时的聚合查询:

SELECT DATE_FORMAT(order_time, '%Y-%m-%d %H:00:00') AS hour,SUM(order_amount) AS total_sales,COUNT(DISTINCT user_id) AS unique_customers
FROM realtime_orders
WHERE order_time >= DATE_SUB(NOW(), INTERVAL 1 DAY)
GROUP BY DATE_FORMAT(order_time, '%Y-%m-%d %H:00:00')
ORDER BY hour DESC;

这个查询可以实时显示过去24小时内每小时的销售额和独立客户数。

16. 机器学习模型部署与服务

在之前的内容中,我们讨论了如何使用Spark MLlib与Doris结合进行机器学习。现在,让我们更进一步,看看如何将训练好的模型部署到生产环境中,并与Doris集成以提供实时预测服务。

我们可以使用Flask创建一个简单的预测服务,然后通过Doris的自定义函数(UDF)来调用这个服务:

  1. 首先,创建一个Flask应用来提供预测服务:
from flask import Flask, request, jsonify
import joblibapp = Flask(__name__)
model = joblib.load('recommendation_model.pkl')@app.route('/predict', methods=['POST'])
def predict():data = request.jsonprediction = model.predict(data['user_id'], data['item_id'])return jsonify({'prediction': float(prediction)})if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
  1. 然后,在Doris中创建一个UDF来调用这个预测服务:
CREATE FUNCTION predict_rating(user_id INT, item_id INT) RETURNS DOUBLE PROPERTIES ("type" = "JAVA_UDF","file" = "file:///path/to/predict_udf.jar","class" = "com.example.doris.udf.PredictRating","method" = "evaluate"
);
  1. 在Java UDF中实现对预测服务的调用:
public class PredictRating extends ScalarFunction {public Double evaluate(Integer userId, Integer itemId) {// 调用预测服务的逻辑// 返回预测结果}
}
  1. 现在我们可以在Doris中直接使用这个UDF进行预测:
SELECT user_id, item_id, predict_rating(user_id, item_id) AS predicted_rating
FROM user_item_interactions
WHERE predict_rating(user_id, item_id) > 4.0;

这个查询可以找出模型预测评分高于4.0的所有用户-物品对,可以用于推荐系统。

Doris的未来:云原生与更多可能

随着我在Doris领域的不断深入,我开始关注更多前沿的应用场景和技术趋势。在这个快速发展的大数据时代,Doris也在不断进化,适应新的技术生态。让我们一起探索Doris在云原生环境中的应用,以及它的未来发展方向。

17. Doris与云原生的结合

image.png

随着云计算的普及,将Doris部署在云环境中变得越来越常见。我们来看看如何在Kubernetes (K8s)环境中部署和管理Doris。

使用Helm部署Doris

Helm是Kubernetes的包管理工具,我们可以使用它来简化Doris的部署过程。

  1. 首先,创建一个Doris的Helm Chart:
# Chart.yaml
apiVersion: v2
name: doris
description: A Helm chart for Apache Doris on Kubernetes
version: 0.1.0
appVersion: "1.0.0"# values.yaml
fe:replicaCount: 3image:repository: apache/doristag: "1.0.0-fe"
be:replicaCount: 5image:repository: apache/doristag: "1.0.0-be"
  1. 使用Helm部署Doris:
helm install my-doris ./doris

这种方式让我们可以更灵活地管理Doris集群,轻松实现扩缩容和版本升级。

使用Operator管理Doris

为了更好地在K8s中管理Doris,社区正在开发Doris Operator。这让我们可以用Kubernetes原生的方式来管理Doris集群。

apiVersion: doris.apache.org/v1
kind: DorisCluster
metadata:name: example-doris-cluster
spec:fe:replicas: 3resources:requests:cpu: "2"memory: "4Gi"be:replicas: 5resources:requests:cpu: "4"memory: "16Gi"

使用Operator,我们可以更方便地管理Doris的生命周期,包括升级、扩缩容、备份恢复等操作。

18. 大规模Doris集群的管理与优化

随着数据量的增长,我们可能需要管理包含数百个节点的大规模Doris集群。这里有一些我学到的管理技巧:

自动化运维

使用Ansible或Terraform等工具来自动化集群的部署和管理:

- name: Deploy Doris Clusterhosts: alltasks:- name: Install Dorisansible.builtin.yum:name: dorisstate: present- name: Start Doris serviceansible.builtin.service:name: dorisstate: started
监控与告警

使用Prometheus和Grafana来监控Doris集群的健康状态:

global:scrape_interval: 15sscrape_configs:- job_name: 'doris'static_configs:- targets: ['doris-fe:8030', 'doris-be:8040']

19. Doris的安全性考虑

在企业环境中,数据安全至关重要。Doris提供了多层次的安全机制:
image.png

认证与授权

使用LDAP集成实现统一的用户认证:

ADMIN SET FRONTEND CONFIG ("authentication_ldap_simple_server_host" = "ldap://ldap.example.com","authentication_ldap_simple_bind_root_dn" = "cn=admin,dc=example,dc=com","authentication_ldap_simple_bind_root_pwd" = "admin_password"
);
数据加密

启用数据传输加密和存储加密:

ADMIN SET FRONTEND CONFIG ("enable_ssl" = "true","ssl_certificate_path" = "/path/to/server.crt","ssl_private_key_path" = "/path/to/server.key"
);

20. Doris的未来发展趋势

作为一个快速发展的开源项目,Doris正在向着更强大、更灵活的方向发展。以下是一些值得关注的趋势:

  1. 云原生支持的增强:更好地支持容器化部署和云环境。
  2. AI集成:深度集成机器学习和人工智能能力。
  3. 实时分析能力的提升:支持更低延迟的实时数据分析。
  4. 多模态数据支持:除结构化数据外,支持半结构化和非结构化数据的分析。
  5. 生态系统的扩展:与更多大数据和AI工具的集成。

21. 实战案例:全球化电商平台的数据分析

让我们通过一个具体的案例来看看Doris如何在一个全球化电商平台中发挥作用:

需求
  • 实时监控全球销售数据
  • 支持跨地域的数据分析
  • 处理高并发的用户查询请求
解决方案
  1. 多地域部署
    在主要市场部署Doris集群,使用Doris的跨集群复制功能同步数据。

  2. 实时数据接入
    使用Kafka + Flink CDC捕获订单数据,实时写入Doris。

  3. 查询性能优化

    • 使用分区 + 分桶策略优化数据分布
    • 创建适当的物化视图加速常用查询
  4. 可视化
    集成Superset作为BI工具,提供直观的数据可视化界面。

核心SQL示例
-- 创建跨地域销售分析表
CREATE TABLE global_sales (order_id BIGINT,user_id BIGINT,product_id BIGINT,order_time DATETIME,amount DECIMAL(10, 2),region VARCHAR(20)
)
PARTITION BY RANGE(order_time) (PARTITION p2023_Q1 VALUES LESS THAN ('2023-04-01'),PARTITION p2023_Q2 VALUES LESS THAN ('2023-07-01'),PARTITION p2023_Q3 VALUES LESS THAN ('2023-10-01'),PARTITION p2023_Q4 VALUES LESS THAN ('2024-01-01')
)
DISTRIBUTED BY HASH(order_id) BUCKETS 48;-- 创建实时销售趋势物化视图
CREATE MATERIALIZED VIEW mv_hourly_sales AS
SELECT DATE_FORMAT(order_time, '%Y-%m-%d %H:00:00') AS hour,region,SUM(amount) AS total_sales,COUNT(DISTINCT user_id) AS unique_users
FROM global_sales
GROUP BY DATE_FORMAT(order_time, '%Y-%m-%d %H:00:00'), region;-- 查询最近24小时各地区销售趋势
SELECT hour, region, total_sales, unique_users
FROM mv_hourly_sales
WHERE hour >= DATE_SUB(NOW(), INTERVAL 24 HOUR)
ORDER BY hour DESC, total_sales DESC;

这个案例展示了Doris如何在复杂的全球化业务场景中提供高性能、实时的数据分析能力。

Doris的多元化应用:跨行业案例研究

在我们的Doris学习之旅中,我们已经探讨了很多技术细节和通用应用场景。现在,让我们深入到几个具体的行业,看看Doris如何在这些领域发挥其强大的分析能力。同时,我们也将探讨Doris如何与新兴技术结合,开创更多可能性。

22. 金融行业:实时风控系统

image.png

在金融行业,实时风险控制是一个关键的应用场景。让我们看看如何使用Doris构建一个高效的实时风控系统。

需求
  • 实时处理交易数据
  • 快速识别潜在的欺诈交易
  • 支持复杂的多维度分析
解决方案
  1. 数据接入:使用Kafka实时接入交易数据
  2. 实时计算:利用Doris的流式导入功能实时处理数据
  3. 风险评分:使用Doris的UDF功能实现复杂的风险评分算法
  4. 实时告警:基于评分结果触发实时告警
核心实现
-- 创建实时交易表
CREATE TABLE realtime_transactions (transaction_id BIGINT,user_id BIGINT,amount DECIMAL(15, 2),transaction_time DATETIME,location VARCHAR(50),device_id VARCHAR(50),risk_score DOUBLE DEFAULT "0"
)
PARTITION BY RANGE(transaction_time) (PARTITION p2023_1 VALUES LESS THAN ("2023-07-01"),PARTITION p2023_2 VALUES LESS THAN ("2024-01-01")
)
DISTRIBUTED BY HASH(transaction_id) BUCKETS 32;-- 创建风险评分UDF
CREATE FUNCTION calculate_risk_score(amount DOUBLE, location STRING, device_id STRING) 
RETURNS DOUBLE PROPERTIES ("file"="hdfs://path/to/risk_score_udf.jar","symbol"="com.example.RiskScoreUDF","type"="JAVA_UDF"
);-- 创建实时风险评估视图
CREATE MATERIALIZED VIEW mv_risk_assessment AS
SELECT transaction_id,user_id,amount,transaction_time,calculate_risk_score(amount, location, device_id) AS risk_score
FROM realtime_transactions;-- 查询高风险交易
SELECT * FROM mv_risk_assessment
WHERE risk_score > 0.8
ORDER BY transaction_time DESC
LIMIT 100;

这个方案允许我们实时计算每笔交易的风险分数,并快速识别高风险交易。

23. 物联网(IoT):智能工厂数据分析

image.png

随着工业4.0的推进,智能工厂成为了一个热门话题。Doris如何在这样的场景中发挥作用呢?

需求
  • 实时收集和分析海量传感器数据
  • 预测设备故障
  • 优化生产流程
解决方案
  1. 边缘计算:在工厂本地部署Doris边缘节点,实现数据的初步处理
  2. 数据同步:将汇总后的数据同步到云端Doris集群
  3. 实时监控:创建仪表板实时监控生产状态
  4. 预测性维护:利用Doris对接机器学习模型,预测设备故障
核心实现
-- 创建边缘节点的传感器数据表
CREATE TABLE edge_sensor_data (sensor_id INT,timestamp DATETIME,temperature DOUBLE,pressure DOUBLE,vibration DOUBLE
)
PARTITION BY RANGE(timestamp) (PARTITION p2023_Q3 VALUES LESS THAN ("2023-10-01"),PARTITION p2023_Q4 VALUES LESS THAN ("2024-01-01")
)
DISTRIBUTED BY HASH(sensor_id) BUCKETS 16;-- 创建云端汇总表
CREATE TABLE cloud_sensor_summary (sensor_id INT,hour DATETIME,avg_temperature DOUBLE,avg_pressure DOUBLE,avg_vibration DOUBLE,anomaly_score DOUBLE DEFAULT "0"
)
PARTITION BY RANGE(hour) (PARTITION p2023_Q3 VALUES LESS THAN ("2023-10-01"),PARTITION p2023_Q4 VALUES LESS THAN ("2024-01-01")
)
DISTRIBUTED BY HASH(sensor_id) BUCKETS 32;-- 在边缘节点创建汇总任务
INSERT INTO cloud_sensor_summary
SELECT sensor_id,DATE_TRUNC('HOUR', timestamp) AS hour,AVG(temperature) AS avg_temperature,AVG(pressure) AS avg_pressure,AVG(vibration) AS avg_vibration
FROM edge_sensor_data
GROUP BY sensor_id, DATE_TRUNC('HOUR', timestamp);-- 在云端创建异常检测视图
CREATE MATERIALIZED VIEW mv_anomaly_detection AS
SELECT *,detect_anomaly(avg_temperature, avg_pressure, avg_vibration) AS anomaly_score
FROM cloud_sensor_summary;-- 查询可能的异常
SELECT * FROM mv_anomaly_detection
WHERE anomaly_score > 0.7
ORDER BY hour DESC, anomaly_score DESC
LIMIT 50;

这个方案实现了从边缘到云端的数据处理流程,并能够实时检测潜在的设备异常。

24. 新零售:全渠道数据整合

新零售模式要求将线上和线下渠道的数据进行无缝整合。Doris如何助力这一过程呢?
image.png

需求
  • 整合线上和线下销售数据
  • 实时库存管理
  • 个性化推荐
解决方案
  1. 数据整合:使用Doris的外部表功能连接不同数据源
  2. 实时同步:利用Flink CDC实时捕获变更数据
  3. 统一分析:创建跨渠道的统一分析视图
  4. 个性化推荐:结合机器学习模型,实现实时个性化推荐
核心实现
-- 创建线上销售外部表
CREATE EXTERNAL TABLE online_sales (order_id BIGINT,user_id BIGINT,product_id BIGINT,quantity INT,price DECIMAL(10, 2),order_time DATETIME
)
ENGINE=MYSQL
PROPERTIES ("host" = "mysql_host","port" = "3306","user" = "username","password" = "password","database" = "online_db","table" = "sales"
);-- 创建线下销售表
CREATE TABLE offline_sales (transaction_id BIGINT,store_id INT,product_id BIGINT,quantity INT,price DECIMAL(10, 2),transaction_time DATETIME
)
PARTITION BY RANGE(transaction_time) (PARTITION p2023_Q3 VALUES LESS THAN ("2023-10-01"),PARTITION p2023_Q4 VALUES LESS THAN ("2024-01-01")
)
DISTRIBUTED BY HASH(transaction_id) BUCKETS 32;-- 创建统一销售视图
CREATE MATERIALIZED VIEW mv_unified_sales AS
SELECT 'online' AS channel,product_id,SUM(quantity) AS total_quantity,SUM(quantity * price) AS total_revenue,COUNT(DISTINCT user_id) AS unique_customers
FROM online_sales
GROUP BY product_idUNION ALLSELECT 'offline' AS channel,product_id,SUM(quantity) AS total_quantity,SUM(quantity * price) AS total_revenue,COUNT(DISTINCT transaction_id) AS unique_transactions
FROM offline_sales
GROUP BY product_id;-- 查询跨渠道销售表现
SELECT product_id,SUM(CASE WHEN channel = 'online' THEN total_revenue ELSE 0 END) AS online_revenue,SUM(CASE WHEN channel = 'offline' THEN total_revenue ELSE 0 END) AS offline_revenue,SUM(total_revenue) AS total_revenue
FROM mv_unified_sales
GROUP BY product_id
ORDER BY total_revenue DESC
LIMIT 20;

这个方案实现了线上线下数据的无缝整合,为全渠道分析提供了基础。

25. Doris与新兴技术的结合

随着技术的不断发展,Doris也在与新兴技术不断融合,开创新的应用场景。

5G与边缘计算

5G的低延迟特性与边缘计算相结合,可以实现更接近数据源的实时分析。我们可以在边缘节点部署轻量级的Doris集群,处理本地数据,然后将汇总结果传输到中心Doris集群。

# 在边缘节点部署Doris
docker run -d --name doris-edge \-p 8030:8030 -p 9020:9020 -p 9030:9030 \-v /path/to/doris/config:/opt/apache-doris/conf \apache/doris:1.2.0
AI与Doris的深度集成

image.png

随着AI技术的发展,我们可以考虑将更多的AI能力直接集成到Doris中:

  1. 向量检索:支持高效的向量相似度查询,用于推荐系统或图像检索。
  2. 自然语言处理:集成NLP模型,支持文本数据的语义分析。
  3. 时间序列预测:内置时间序列预测算法,用于销售预测、设备监控等场景。
-- 假设未来Doris支持向量检索
CREATE TABLE product_embeddings (product_id BIGINT,embedding VECTOR(128)  -- 128维的产品向量表示
)
ENGINE=VECTORINDEX
PROPERTIES ("index_type" = "HNSW","metric_type" = "L2"
);-- 查询相似产品
SELECT product_id, L2_distance(embedding, [0.1, 0.2, ...]) AS distance
FROM product_embeddings
ORDER BY distance ASC
LIMIT 10;
区块链数据分析

随着区块链技术的成熟,分析区块链数据成为一个新的需求。Doris可以作为区块链数据的分析引擎:

CREATE TABLE blockchain_transactions (block_number BIGINT,transaction_hash VARCHAR(66),from_address VARCHAR(42),to_address VARCHAR(42),value DECIMAL(38, 18),gas_price BIGINT,timestamp DATETIME
)
PARTITION BY RANGE(block_number) (PARTITION p0 VALUES LESS THAN (10000000),PARTITION p1 VALUES LESS THAN (20000000)
)
DISTRIBUTED BY HASH(transaction_hash) BUCKETS 64;-- 分析大额交易
SELECT DATE_TRUNC('DAY', timestamp) AS date,COUNT(*) AS large_tx_count,SUM(value) AS total_value
FROM blockchain_transactions
WHERE value > 100  -- 假设单位是ETH
GROUP BY DATE_TRUNC('DAY', timestamp)
ORDER BY date DESC;

Doris的进阶之路:高级优化与生态系统集成

在我们的Doris学习旅程中,我们已经探讨了许多基础概念、应用场景和行业案例。现在,让我们深入到一些更高级的主题,包括性能优化技巧、与其他大数据技术的深度集成,以及在复杂数据分析场景中的应用。这些知识将帮助我们在实际项目中更好地发挥Doris的潜力。

26. Doris查询优化的艺术

随着数据量的增长和查询复杂度的提高,查询优化成为了一个关键话题。让我们探讨一些高级的查询优化技巧。

分区剪枝

合理的分区设计可以大大提高查询效率:

-- 优化前
CREATE TABLE sales_data (sale_date DATE,product_id INT,amount DECIMAL(10, 2)
)
DISTRIBUTED BY HASH(product_id) BUCKETS 32;-- 优化后
CREATE TABLE sales_data (sale_date DATE,product_id INT,amount DECIMAL(10, 2)
)
PARTITION BY RANGE(sale_date) (PARTITION p2023_01 VALUES LESS THAN ('2023-02-01'),PARTITION p2023_02 VALUES LESS THAN ('2023-03-01'),...
)
DISTRIBUTED BY HASH(product_id) BUCKETS 32;-- 优化后的查询可以利用分区剪枝
SELECT SUM(amount)
FROM sales_data
WHERE sale_date BETWEEN '2023-01-01' AND '2023-01-31';
物化视图优化

为常用的聚合查询创建物化视图:

-- 创建物化视图
CREATE MATERIALIZED VIEW mv_daily_sales AS
SELECT sale_date,product_id,SUM(amount) AS total_amount,COUNT(DISTINCT product_id) AS product_count
FROM sales_data
GROUP BY sale_date, product_id;-- 查询将自动使用物化视图
SELECT sale_date, SUM(total_amount)
FROM sales_data
GROUP BY sale_date;
子查询优化

将复杂的子查询改写为JOIN,可能会提高性能:

-- 优化前
SELECT *
FROM orders
WHERE customer_id IN (SELECT idFROM customersWHERE region = 'North'
);-- 优化后
SELECT o.*
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE c.region = 'North';
使用EXPLAIN分析查询计划
EXPLAIN SELECT * FROM sales_data WHERE sale_date > '2023-01-01';

通过分析执行计划,我们可以找出潜在的性能瓶颈,如全表扫描、低效的JOIN等。

27. Doris与Hadoop生态系统的深度集成

image.png

Doris作为一个开放的系统,可以与Hadoop生态系统的多个组件进行深度集成,从而构建更强大的数据分析平台。

与Hive的集成

通过创建外部表,我们可以在Doris中查询Hive的数据:

CREATE EXTERNAL TABLE ext_hive_table (id INT,name STRING,age INT
)
ENGINE=HIVE
PROPERTIES ("hive.metastore.uris" = "thrift://metastore_host:9083","database" = "default","table" = "hive_table"
);-- 现在可以直接查询Hive的数据了
SELECT * FROM ext_hive_table WHERE age > 30;
与Spark的集成

使用Spark-Doris-Connector,我们可以在Spark中高效地读写Doris数据:

import org.apache.spark.sql.SparkSessionval spark = SparkSession.builder().appName("DorisSparkExample").getOrCreate()// 读取Doris数据
val dorisDf = spark.read.format("doris").option("doris.table.identifier", "example_db.table_name").option("doris.fenodes", "fe_host:8030").load()// 处理数据
val resultDf = dorisDf.groupBy("column_name").count()// 写回Doris
resultDf.write.format("doris").option("doris.table.identifier", "example_db.result_table").option("doris.fenodes", "fe_host:8030").save()
与Flink的集成

使用Flink-Doris-Connector,我们可以实现实时数据处理和分析:

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);// 创建Doris表
tEnv.executeSql("CREATE TABLE doris_table (" +"    id INT," +"    name STRING," +"    age INT" +") WITH (" +"    'connector' = 'doris'," +"    'fenodes' = 'fe_host:8030'," +"    'table.identifier' = 'example_db.table_name'," +"    'username' = 'root'," +"    'password' = ''" +")");// 执行查询
tEnv.executeSql("SELECT age, COUNT(*) as count FROM doris_table GROUP BY age").print();env.execute();

28. Doris在复杂数据分析场景中的应用

随着数据分析需求的日益复杂,Doris也在不断进化以满足这些需求。让我们看看Doris如何应对一些复杂的数据分析场景。

实时OLAP分析

假设我们需要构建一个实时的用户行为分析系统:

-- 创建实时用户行为表
CREATE TABLE user_behaviors (user_id BIGINT,event_time DATETIME,event_type VARCHAR(20),page_id VARCHAR(50),session_id VARCHAR(50)
)
PARTITION BY RANGE(event_time) (PARTITION p2023_07 VALUES LESS THAN ('2023-08-01'),PARTITION p2023_08 VALUES LESS THAN ('2023-09-01')
)
DISTRIBUTED BY HASH(user_id) BUCKETS 32;-- 创建实时会话分析视图
CREATE MATERIALIZED VIEW mv_session_analysis AS
SELECT session_id,MIN(event_time) AS session_start,MAX(event_time) AS session_end,COUNT(*) AS event_count,COUNT(DISTINCT page_id) AS unique_pages
FROM user_behaviors
GROUP BY session_id;-- 实时查询长会话
SELECT *
FROM mv_session_analysis
WHERE TIMESTAMPDIFF(MINUTE, session_start, session_end) > 30
ORDER BY event_count DESC
LIMIT 100;

这个例子展示了如何使用Doris进行实时的会话分析,可以快速识别长时间和高互动的用户会话。

时序数据分析

对于IoT或金融等领域的时序数据分析,Doris也能够胜任:

-- 创建时序数据表
CREATE TABLE sensor_data (sensor_id INT,timestamp DATETIME,temperature DOUBLE,humidity DOUBLE,pressure DOUBLE
)
PARTITION BY RANGE(timestamp) (PARTITION p2023_Q3 VALUES LESS THAN ('2023-10-01'),PARTITION p2023_Q4 VALUES LESS THAN ('2024-01-01')
)
DISTRIBUTED BY HASH(sensor_id) BUCKETS 32;-- 时序聚合分析
SELECT sensor_id,DATE_TRUNC('hour', timestamp) AS hour,AVG(temperature) AS avg_temp,MAX(temperature) AS max_temp,MIN(temperature) AS min_temp,AVG(humidity) AS avg_humidity,AVG(pressure) AS avg_pressure
FROM sensor_data
WHERE timestamp BETWEEN '2023-07-01' AND '2023-07-31'
GROUP BY sensor_id, DATE_TRUNC('hour', timestamp)
ORDER BY sensor_id, hour;-- 使用窗口函数进行滑动平均分析
SELECT sensor_id,timestamp,temperature,AVG(temperature) OVER (PARTITION BY sensor_idORDER BY timestampROWS BETWEEN 5 PRECEDING AND CURRENT ROW) AS moving_avg_temp
FROM sensor_data
WHERE sensor_id = 1
ORDER BY timestamp;

这个例子展示了如何使用Doris进行时序数据的聚合分析和滑动窗口分析。

图数据分析

尽管Doris不是专门的图数据库,但我们可以使用它来进行一些基本的图分析:

-- 创建边表
CREATE TABLE edges (source_id BIGINT,target_id BIGINT,weight DOUBLE
)
DISTRIBUTED BY HASH(source_id) BUCKETS 32;-- 查找两跳邻居
WITH one_hop AS (SELECT DISTINCT target_idFROM edgesWHERE source_id = 1
),
two_hop AS (SELECT DISTINCT e.target_idFROM one_hop ohJOIN edges e ON oh.target_id = e.source_idWHERE e.target_id != 1
)
SELECT * FROM two_hop;-- 计算页面排名(简化版)
CREATE TABLE page_rank (node_id BIGINT,rank DOUBLE
)
DISTRIBUTED BY HASH(node_id) BUCKETS 32;-- 迭代计算页面排名(这里只展示一次迭代)
INSERT INTO page_rank
SELECT e.target_id AS node_id,SUM(pr.rank / out_degree.cnt) AS rank
FROM edges e
JOIN page_rank pr ON e.source_id = pr.node_id
JOIN (SELECT source_id, COUNT(*) AS cntFROM edgesGROUP BY source_id
) out_degree ON e.source_id = out_degree.source_id
GROUP BY e.target_id;

这个例子展示了如何使用Doris进行简单的图分析,包括查找两跳邻居和简化版的PageRank计算。

29. Doris的未来:持续优化与创新

作为一个快速发展的开源项目,Doris正在不断优化和创新。以下是一些值得期待的方向:
image.png

  1. 查询优化器的持续改进:更智能的CBO(基于代价的优化器)和RBO(基于规则的优化器)。
  2. 更好的存储引擎:支持列存和行存的混合存储,以适应不同的查询模式。
  3. 增强的AI集成:内置更多机器学习算法,支持更复杂的预测和分类任务。
  4. 更强大的实时分析能力:优化流式数据处理,支持更低延迟的实时分析。
  5. 云原生支持的加强:更好地支持K8s等云原生环境,简化部署和运维。

image.png

结语:在技术的海洋中乘风破浪

回顾我们的Doris学习之旅,从最初的基础概念到现在探讨高级优化技巧和复杂分析场景,我们见证了Doris的强大、灵活和不断进化的特性。这个旅程不仅是对Doris的深入探索,更是对整个大数据生态系统和分析技术的全面认识。

在这个技术快速迭代的时代,"糙快猛"的学习方法让我们能够快速适应新技术,在实践中学习和成长。但同时,我们也要记住,真正的技术精进来自于在"糙快猛"的基础上的不断思考、实践和创新。

对于所有正在或即将开始Doris学习之旅的朋友,我想说:

  1. 保持好奇心:技术世界永远充满新知识,保持对新事物的好奇和学习的热情。
  2. 深入原理:不要满足于表面的应用,要深入理解Doris的内部原理,这将帮助你更好地优化和排障。
  3. 跨界思考:将Doris与其他技术结合,思考如何在更广阔的场景中应用它。
  4. 实践为王:纸上得来终觉浅,绝知此事要躬行。不断在实际项目中应用所学,才能真正掌握。
  5. 回馈社区:将你的经验、发现甚至代码贡献给社区,推动Doris的发展,也提升

image.png

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

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

相关文章

Django实战:开启数字化任务管理的新纪元

&#x1f680; Django实战&#xff1a;开启数字化任务管理的新纪元 &#x1f310; &#x1f4d6; 引言 在数字化转型的浪潮中&#xff0c;任务管理的智能化成为提升组织效能的关键。今天&#xff0c;我将带领大家深入了解我们最新开发的OFTS系统——一款创新的组织任务管理软…

双指针-【3,4,5,6,7,8】

第三题&#xff1a;快乐数 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/happy-number/算法思想&#xff1a; 1.每个…

SpringBoot上传超大文件导致OOM,完美解决办法

问题描述 上传大文件报错: Caused by: java.lang.OutOfMemoryError at java.io.ByteArrayOutputStream.hugeCapacity(ByteArrayOutputStream.java:123) ~[?:1.8.0_381] at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:117) ~[?:1.8.0_381] …

调用百度的大模型API接口实现AI对话!手把手教程!

本文介绍如何使用百度的大模型API接口实现一个AI对话项目 1 注册百度云 2 获取API接口 3 配置环境 4 代码编写与运行 5 chat models 1 注册百度云 搜索百度云&#xff0c;打开官网注册&#xff0c;充值一点点大米&#xff08;收费很低&#xff0c;大概生成几个句子花费一毛…

FRP配置内网穿透52版本以上适用

简述 适用frp配置内网穿透来说我们需要进行简单的区分&#xff0c;具有公网IP的服务器我们简称为服务端&#xff0c;内网的服务器我们可以简称为客户端&#xff0c;frp需要针对不同的服务器配置不同的文件 下载安装包 Linux下载地址 https://github.com/fatedier/frp/relea…

好的STEM编程语言有哪些?

STEM是科学&#xff08;Science&#xff09;&#xff0c;技术&#xff08;Technology&#xff09;&#xff0c;工程&#xff08;Engineering&#xff09;&#xff0c;数学&#xff08;Mathematics&#xff09;四门学科英文首字母的缩写&#xff0c;STEM教育简单来说就是在通过在…

如何通过✅ IPIDEA代理IP,轻松实现数据采集和市场拓展工作(下)

如何通过✅ IPIDEA代理IP&#xff0c;轻松实现数据采集和市场拓展工作 如何通过✅ IPIDEA代理IP&#xff0c;轻松实现数据采集和市场拓展工作前言IPIDEA爬虫实战实战Demo演示总结 如何通过✅ IPIDEA代理IP&#xff0c;轻松实现数据采集和市场拓展工作 前言 在当今全球化市场的…

微信小游戏之三消(三)道具相关方法

设计一个 game class。负责了游戏的核心控制逻辑&#xff0c;包括游戏状态管理、方块和道具的生成与效果处理&#xff0c;以及游戏的重新开始和复活流程。通过这些方法&#xff0c;脚本实现了游戏的基本玩法和用户交互。 主要游戏控制方法 gameStart()&#xff1a;开始游戏&am…

MySQL常见指令

MySQL中的数据类型 大致分为五种&#xff1a;数值&#xff0c;日期和时间&#xff0c;字符串&#xff0c;json&#xff0c;空间类型 每种类型也包括也一些不同的子类型&#xff0c;根据需要来选择。 如数值类型包括整数类型和浮点数类型 整数类型根据占用的存储空间的不同 又…

Cocos Creator2D游戏开发(7)-飞机大战(5)-让子弹飞

飞机大战(5)-碰撞及积分 参考敌机的生成 子弹由飞机生成,放在player_node节点子弹重复使用,要使用预制体;子弹新增了动画 ①创建一个预制体 命名为playerBullet_prefab ② 双击预制体将bullet1图片拖入预制体 保存,关闭(场景编辑器里面的) ③ 发射子弹 player加入代码 prop…

听说它可以让代码更优雅

一提到静态代码检查工具这个词应该比较好理解&#xff0c;所谓静态代码检查工具就是检查静态代码的工具&#xff0c;完美~ 言归正传&#xff0c;相信很多程序员朋友都听说过静态代码检查工具这个概念&#xff0c;它可能是我们IDE里的某一个插件&#xff0c;可能是计算机中的一…

RK3588+MIPI+GMSL+AI摄像机:自动车载4/8通道GMSL采集/边缘计算盒解决方案

RK3588作为目前市面能买到的最强国产SOC&#xff0c;有强大的硬件配置。在智能汽车飞速发展&#xff0c;对图像数据矿场要求越来越多的环境下&#xff0c;如何高效采集数据&#xff0c;或者运行AI应用&#xff0c;成为刚需。 推出的4/8通道GMSL采集/边缘计算盒产品满足这些需求…

Spring验证码

前言&#xff1a;使用Hutool 1.什么是Hutool&#xff1f; 2.代码复制到test类中 3.代码爆红&#xff0c;说明需要引入依赖 4.根据名取Maven仓库相关依赖 5.在pom.xml文件中进行配置 6.引入成功 7. 运行程序 打开d盘&#xff0c;发现已经生成了验证码的图片&#xff0c;路径在…

Codeforces Round 654 (Div. 2) C. A Cookie for You (模拟)

我认为这道题就是个脑筋急转弯。 首先我们知道当a b < n m的时候&#xff0c;饼干总数都不够人的总数&#xff0c;那肯定是NO。 并且注意题干&#xff0c;我们可以得知当a b的时候&#xff0c;第一类和第二类人可以任意选两种饼干中的一种。 之后我们可以分类讨论一下。 …

网格布局 HTML CSS grid layout demo

文章目录 页面效果代码 (HTML CSS)参考 页面效果 代码 (HTML CSS) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

[ BLE4.0 ] 伦茨ST17H66开发-串口UART0的接收与发送

目录 一、前言 二、实现步骤 1.设置回调函数 2.关闭睡眠模式 三、效果展示 四、工程源代码 一、前言 串口通信在任何一款单片机开发中都是尤为重要的。本文涉及的开发所使用的例程依然是基于[ BLE4.0 ] 伦茨ST17H66开发-OSAL系统中添加自己的Task任务文章的工程源码&#x…

windows@powershell@任务计划@自动任务计划@taskschd.msc.md

文章目录 使用任务计划windows中的任务计划任务计划命令行程序开发windows 应用中相关api传统图形界面FAQ schtasks 命令常见用法创建计划任务删除计划任务查询计划任务修改计划任务运行计划任务 PowerShell ScheduledTasks常用 cmdlet 简介1. Get-ScheduledTask2. Register-Sc…

Git远程仓库推送

这里我只连接了两个站点的远程仓库&#xff0c;一个是国内的Gitee&#xff0c;另一个是Github&#xff0c;这两个站点的连接方式主要有两种&#xff0c;第一种就是通过https来连接远程仓库&#xff0c;另一种是通过ssh公钥来连接&#xff0c;这两个站点练接的大致过程都是一样的…

我出一道面试题,看看你能拿 3k 还是 30k!

大家好&#xff0c;我是程序员鱼皮。欢迎屏幕前的各位来到今天的模拟面试现场&#xff0c;接下来我会出一道经典的后端面试题&#xff0c;你只需要进行 4 个简单的选择&#xff0c;就能判断出来你的水平是新手&#xff08;3k&#xff09;、初级&#xff08;10k&#xff09;、中…

4 款最佳 C# 无头浏览器

摘要&#xff1a; 在当今大数据时代&#xff0c;高效的数据采集成为众多项目的关键一环。对于偏好C#语言的开发者而言&#xff0c;无头浏览器是实现网页自动化交互、数据抓取的强大工具。本文将深入探讨四款顶尖的C#无头浏览器库&#xff0c;分析它们的特性和应用场景&#xf…