如何学习Doris:糙快猛的大数据之路(从入门到专家)
引言:大数据世界的新玩家
还记得我第一次听说"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是什么?
在开始学习之前,我们先来简单了解一下Doris。
Apache Doris是一个现代化的MPP(大规模并行处理)分析型数据库,专为快速分析而生。它支持多维分析,能够处理结构化和半结构化数据,并提供亚秒级的查询响应时间。
简单来说,Doris就像是一个超级强大的Excel,可以处理海量数据,并且能快速给出你想要的分析结果。
学习Doris的糙快猛之路
1. 不求甚解,先跑起来
记得刚开始学Doris时,我看着那厚厚的文档,心里一阵发怵。但我很快想到了我的座右铭:“糙快猛,就是干!”
于是,我决定先不管那么多,把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. 从简单查询开始
有了运行的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;
看到查询结果出现在屏幕上,我忍不住喊了一声:“芜湖,起飞!”
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学习之路,我深刻体会到"糙快猛"学习方法的威力。它让我能够:
- 快速上手,不被繁复的细节所困扰
- 在实践中学习,加深对知识的理解
- 勇于尝试,从错误中吸取教训
- 充分利用现代工具,如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的物化视图功能就让我眼前一亮。
创建物化视图
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飞起来
随着数据量的增加,我开始关注如何提升Doris的性能。除了选择合适的数据模型和使用物化视图外,我还学会了一些其他的调优技巧:
-
合理设置分桶数:
ALTER TABLE my_table DISTRIBUTED BY HASH(user_id) BUCKETS 20;
-
使用分区:
ALTER TABLE daily_user_actions ADD PARTITION p202307 VALUES LESS THAN ("2023-08-01");
-
设置合适的副本数:
ALTER TABLE my_table MODIFY PARTITION p202307 SET ("replication_num" = "3");
这些优化措施让我的Doris集群性能有了显著提升,查询速度飞快,我心里那个小人儿又开始得意地喊:“看我把Doris玩儿明白了吧!”
8. 融入生态:Doris的朋友们
在深入学习Doris的过程中,我发现Doris并不是孤立存在的,它可以很好地与其他大数据工具协同工作。比如:
- 使用Flink CDC实时同步MySQL数据到Doris
- 通过Spark读写Doris数据
- 使用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的数据导入方式
随着项目的推进,我需要处理越来越多的数据导入任务。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的高可用与扩展
在生产环境中使用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本身不直接支持机器学习,但我们可以通过以下方式实现:
- 使用Doris进行数据预处理和特征工程
- 将处理后的数据导出到支持机器学习的平台(如Spark MLlib)
- 训练模型并生成预测结果
- 将预测结果导回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)来调用这个服务:
- 首先,创建一个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)
- 然后,在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"
);
- 在Java UDF中实现对预测服务的调用:
public class PredictRating extends ScalarFunction {public Double evaluate(Integer userId, Integer itemId) {// 调用预测服务的逻辑// 返回预测结果}
}
- 现在我们可以在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与云原生的结合
随着云计算的普及,将Doris部署在云环境中变得越来越常见。我们来看看如何在Kubernetes (K8s)环境中部署和管理Doris。
使用Helm部署Doris
Helm是Kubernetes的包管理工具,我们可以使用它来简化Doris的部署过程。
- 首先,创建一个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"
- 使用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提供了多层次的安全机制:
认证与授权
使用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正在向着更强大、更灵活的方向发展。以下是一些值得关注的趋势:
- 云原生支持的增强:更好地支持容器化部署和云环境。
- AI集成:深度集成机器学习和人工智能能力。
- 实时分析能力的提升:支持更低延迟的实时数据分析。
- 多模态数据支持:除结构化数据外,支持半结构化和非结构化数据的分析。
- 生态系统的扩展:与更多大数据和AI工具的集成。
21. 实战案例:全球化电商平台的数据分析
让我们通过一个具体的案例来看看Doris如何在一个全球化电商平台中发挥作用:
需求
- 实时监控全球销售数据
- 支持跨地域的数据分析
- 处理高并发的用户查询请求
解决方案
-
多地域部署:
在主要市场部署Doris集群,使用Doris的跨集群复制功能同步数据。 -
实时数据接入:
使用Kafka + Flink CDC捕获订单数据,实时写入Doris。 -
查询性能优化:
- 使用分区 + 分桶策略优化数据分布
- 创建适当的物化视图加速常用查询
-
可视化:
集成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. 金融行业:实时风控系统
在金融行业,实时风险控制是一个关键的应用场景。让我们看看如何使用Doris构建一个高效的实时风控系统。
需求
- 实时处理交易数据
- 快速识别潜在的欺诈交易
- 支持复杂的多维度分析
解决方案
- 数据接入:使用Kafka实时接入交易数据
- 实时计算:利用Doris的流式导入功能实时处理数据
- 风险评分:使用Doris的UDF功能实现复杂的风险评分算法
- 实时告警:基于评分结果触发实时告警
核心实现
-- 创建实时交易表
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):智能工厂数据分析
随着工业4.0的推进,智能工厂成为了一个热门话题。Doris如何在这样的场景中发挥作用呢?
需求
- 实时收集和分析海量传感器数据
- 预测设备故障
- 优化生产流程
解决方案
- 边缘计算:在工厂本地部署Doris边缘节点,实现数据的初步处理
- 数据同步:将汇总后的数据同步到云端Doris集群
- 实时监控:创建仪表板实时监控生产状态
- 预测性维护:利用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如何助力这一过程呢?
需求
- 整合线上和线下销售数据
- 实时库存管理
- 个性化推荐
解决方案
- 数据整合:使用Doris的外部表功能连接不同数据源
- 实时同步:利用Flink CDC实时捕获变更数据
- 统一分析:创建跨渠道的统一分析视图
- 个性化推荐:结合机器学习模型,实现实时个性化推荐
核心实现
-- 创建线上销售外部表
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的深度集成
随着AI技术的发展,我们可以考虑将更多的AI能力直接集成到Doris中:
- 向量检索:支持高效的向量相似度查询,用于推荐系统或图像检索。
- 自然语言处理:集成NLP模型,支持文本数据的语义分析。
- 时间序列预测:内置时间序列预测算法,用于销售预测、设备监控等场景。
-- 假设未来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生态系统的深度集成
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正在不断优化和创新。以下是一些值得期待的方向:
- 查询优化器的持续改进:更智能的CBO(基于代价的优化器)和RBO(基于规则的优化器)。
- 更好的存储引擎:支持列存和行存的混合存储,以适应不同的查询模式。
- 增强的AI集成:内置更多机器学习算法,支持更复杂的预测和分类任务。
- 更强大的实时分析能力:优化流式数据处理,支持更低延迟的实时分析。
- 云原生支持的加强:更好地支持K8s等云原生环境,简化部署和运维。
结语:在技术的海洋中乘风破浪
回顾我们的Doris学习之旅,从最初的基础概念到现在探讨高级优化技巧和复杂分析场景,我们见证了Doris的强大、灵活和不断进化的特性。这个旅程不仅是对Doris的深入探索,更是对整个大数据生态系统和分析技术的全面认识。
在这个技术快速迭代的时代,"糙快猛"的学习方法让我们能够快速适应新技术,在实践中学习和成长。但同时,我们也要记住,真正的技术精进来自于在"糙快猛"的基础上的不断思考、实践和创新。
对于所有正在或即将开始Doris学习之旅的朋友,我想说:
- 保持好奇心:技术世界永远充满新知识,保持对新事物的好奇和学习的热情。
- 深入原理:不要满足于表面的应用,要深入理解Doris的内部原理,这将帮助你更好地优化和排障。
- 跨界思考:将Doris与其他技术结合,思考如何在更广阔的场景中应用它。
- 实践为王:纸上得来终觉浅,绝知此事要躬行。不断在实际项目中应用所学,才能真正掌握。
- 回馈社区:将你的经验、发现甚至代码贡献给社区,推动Doris的发展,也提升
相关文章:

如何学习Doris:糙快猛的大数据之路(从入门到专家)
引言:大数据世界的新玩家 还记得我第一次听说"Doris"这个名字时的情景吗?那是在一个炎热的夏日午后,我正在办公室里为接下来的大数据项目发愁。作为一个刚刚跨行到大数据领域的新手,我感觉自己就像是被丢进了深海的小鱼—周围全是陌生的概念和技术。 就在这时,我的…...

梯度下降算法,gradient descent algorithm
定义:是一个优化算法,也成最速下降算法,主要的部的士通过迭代找到目标函数的最小值,或者收敛到最小值。 说人话就是求一个函数的极值点,极大值或者极小值 算法过程中有几个超参数: 学习率n,又称…...

Spring boot 2.0 升级到 3.3.1 的相关问题 (六)
文章目录 Spring boot 2.0 升级到 3.3.1 的相关问题 (六)spring-data-redis 和 Spring AOP 警告的问题问题描述问题调研结论解决方案方案1-将冲突的Bean 提升为InfrastructureBean方案2 其他相关资料 Spring boot 2.0 升级到 3.3.1 的相关问题 ÿ…...

C++模版基础知识与STL基本介绍
目录 一. 泛型编程 二. 函数模板 1. 概念 2. 函数模版格式 3. 函数模版的原理 4. 模版函数的实例化 (1). 隐式实例化 (2.) 显式实例化 5. 模版参数的匹配原则 三. 类模板 1. 类模板的定义格式 2. 类模板的实例化 四. STL的介绍 1. 什么是STL? 2. STL的版…...

Android 防止重复点击
1.第一种方式: // 两次点击按钮之间的点击间隔不能少于1000毫秒 private static final int MIN_CLICK_DELAY_TIME 700; private static long lastClickTime; /** * 是否是快速点击 * return */ public static boolean isFastClick() { …...

使用阿里云云主机通过nginx搭建文件服务器
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、准备基础环境二、安装配置nginx三、阿里云安全组配置安全组配置 
微信Android一面凉经(2024)
微信Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《微信Android一面凉经(2024)》。 面试职位: 微信-客户端开发工程师-基础功能(广州) And…...

VMware、Docker - 让虚拟机走主机代理,解决镜像封禁问题
文章目录 虚拟机全局代理配置找到 VMnet8 的 IPv4 地址代理相关配置虚拟机代理配置 Docker 代理配置修改镜像修改 Docker 代理配置 虚拟机全局代理配置 找到 VMnet8 的 IPv4 地址 a)打开此电脑,输入 “控制面板”,然后回车. b)之…...

版本管理|为什么不推荐使用Git Rebase
文章目录 什么是 Git Rebase?如何使用 Git Rebase?基本语法示例更多选项 注意事项何时使用何时避免其他注意事项 为什么需要谨慎使用 Git Rebase?面试中的常见问题问题 1: Git Rebase 和 Git Merge 有何不同?问题 2: 为什么有时应…...

Https post 请求时绕过证书验证方案
解决异常:Caused by: java.security.cert.CertificateException: No subject alternative names matching IP address xxx.xx.xx.xx found // Https POST 请求private cn.hutool.json.JSON PostGsData(String url, String appKey, String token, Map<String, Ob…...

C# 数组常用遍历方式
// 假设数组Point[] points new Point[2];// 第一种遍历 forfor (int i 0; i < points.Length; i){Point p points[i];Console.WriteLine($"X{p.X},y{p.Y}");}// 第二种遍历 foreachforeach (Point p in points){Console.WriteLine($"X{p.X},y{p.Y}"…...

【JavaScript】详解Day.js:轻量级日期处理库的全面指南
文章目录 一、Day.js简介1. 什么是Day.js?2. 安装Day.js 二、Day.js的基本用法1. 创建日期对象2. 格式化日期3. 解析日期字符串4. 操作日期5. 比较日期 三、Day.js的高级功能1. 插件机制2. 国际化支持 四、实际应用案例1. 事件倒计时2. 日历应用 在JavaScript开发中…...

AI算法与图像处理 | 吴恩达团队新作!多模态方向
本文来源公众号“AI算法与图像处理”,仅用于学术分享,侵权删,干货满满。 原文链接:吴恩达团队新作!多模态方向 研究评估了先进多模态基础模型在 10 个数据集上的多样本上下文学习,揭示了持续的性能提升。…...

云服务器Ubuntu18.04进行Nginx配置
云服务器镜像版本信息:Ubuntu 18.04 server 64bit,本文记录了在改版本镜像上安装Nginx,并介绍了Nginx配置文件目录,便于后面再次有需求时进行复习。 文章目录 Nginx的安装Nginx配置文件分析 Nginx的安装 1.执行下面命令进行安装…...

SQL labs-SQL注入(四,sqlmap对于post传参方式的注入)
本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 序言:本文主要讲解基于SQL labs靶场,sqlmap工具进行的post传参方式的SQL注入。 传参方式有两类,一类是直接在url栏内进行url编码后进行的传参&am…...

R包:plot1cell单细胞可视化包
介绍 plot1cell是用于单细胞数据seurat数据对象的可视化包。 安装 ## You might need to install the dependencies below if they are not available in your R library. bioc.packages <- c("biomaRt","GenomeInfoDb","EnsDb.Hsapiens.v86&qu…...

Tent混沌人工蜂群与粒子群混合算法遇到问题,具体问题及解决方案如文。
🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 问题描述 Tent混沌人工蜂…...

Python文献调研(一)环境搭建
一、安装Python版本 1.点击进入Python官网 Download Python | Python.org 2.根据自己的需求选择python的版本,点击【Download】 3.自定义安装路径,记得勾选Add Python xxx to PATH 这步是自动配置环境变量的,如果忘记勾选,建议…...

URL重写
目录 步骤1 规则语法 Nginx URL重写规则语法 Apache URL重写规则语法 步骤2 规则配置 Apache URL重写规则配置 启用mod_rewrite模块 配置.htaccess文件 编写重写规则 测试重写规则 Nginx URL重写规则配置 配置server或location块 测试重写规则 步骤1 规则语法 Ngin…...

git配置环境变量
一.找到git安装目录 打开此git安装目录下的bin文件,复制此文件路径 二.配置环境变量 2.1 右键点击此电脑的属性栏 2.2 点击高级系统配置 2.3 点击环境变量 2.4 按图中步骤进行配置 三.配置完成 win r 输入cmd打开终端 终端页面中输入 git --version 如图所示…...

vue3编程-import.meta.glob实现动态路由(菜单)
import.meta.glob 是vite提供的批量懒加载组件的方法 本地开发环境: const modules import.meta.glob(../views/**/*.vue)这段代码返回的modules是一个Map: key是vue文件的相对路径,值是一个函数,将函数打印出来,如…...

富唯智能转运机器人:高效、智能、未来的选择
在现代工业中,高效的物流和物料处理是提升生产效率的关键。富唯智能转运机器人,以其卓越的技术和智能化的设计,为各行业提供了完美的解决方案。 产品概述 富唯智能转运机器人搭载ICD系列核心控制器,拥有多种移载平台,…...

跨境电商独立站:Shopify/Wordpress/店匠选哪个?
在面对不断增加的平台运营压力时,不少跨境电商的商家逐渐将注意力转向建立自己的独立站。据《中国跨境出口电商发展报告(2022)》所示,中国拥有的独立站数量在2022年已接近20万个,这表明独立站已成为卖家拓展海外市场的…...

减轻幻觉新SOTA,7B模型自迭代训练效果超越GPT-4,上海AI lab发布
LLMs在回答各种复杂问题时,有时会“胡言乱语”,产生所谓的幻觉。解决这一问题的初始步骤就是创建高质量幻觉数据集训练模型以帮助检测、缓解幻觉。 但现有的幻觉标注数据集,因为领域窄、数量少,加上制作成本高、标注人员水平不一…...

53.最大子数组和,动态规划+贪心解法!!!
力扣53最大子数组和 题目动态规划贪心 题目 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 示例 1: 输入:nums…...

python+vue3+onlyoffice在线文档系统实战20240723笔记,项目界面设计和初步开发
经过之前的学习,已经能够正常打开文档了。 目前为止,我们的代码能够实现: 打开文档编辑文档手动保存自动保存虽然功能依然比较少,但是我们已经基本实现了文档管理最核心的功能,而且我们有个非常大的优势,就是支持多人同时在线协同编辑。 现在我们要开发项目,我们得做基…...

谷粒商城实战笔记-72-商品服务-API-属性分组-获取分类属性分组
文章目录 一,后端接口开发Controller层修改接口接口测试 二,前端开发 这一节的内容是开发获取分类属性分组的接口。 一,后端接口开发 Controller层修改接口 修改AttrGroupController接口。 RequestMapping("/list/{catelogId}")p…...

Vue 自定义指令
文章目录 注册局部注册全局注册 钩子钩子参数应用1、按钮权限验证2、自定义用户行为收集指令3、按钮点击防抖4、输入框自动获取焦点5、输入框自动去空字符串6、文字展示不下时展示提示框 注册 局部注册 export default {setup() {/*...*/},directives: {// 在模板中启用 v-fo…...

【python】python图书管理系统_普通用户+管理员菜单(源码+论文)【独一无二】
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…...

智能路面裂缝检测:基于YOLO和深度学习的全流程实现
引言 路面裂缝检测是维护道路质量和延长道路寿命的重要手段。传统的检测方法往往费时费力且易受人为因素影响。为了提高检测效率和准确性,本文介绍了一种基于深度学习的路面裂缝检测系统。该系统包括用户界面,利用YOLO(You Only Look Once&a…...