数据仓库系列17:元数据管理在数据仓库中的作用是什么?

news2024/9/24 9:21:21

想象一下,你正在管理一个巨大的图书馆,里面存放着数以万计的书籍。但是,这个图书馆没有任何目录、索引或分类系统。你能想象找到特定的一本书会有多困难吗?这就是没有元数据管理的数据仓库的真实写照。

目录

    • 什么是元数据?
    • 元数据管理的重要性
    • 元数据在数据仓库中的类型
      • 1. 技术元数据
      • 2. 业务元数据
      • 3. 操作元数据
    • 元数据管理的核心功能
      • 1. 数据目录
      • 2. 数据血缘分析
      • 3. 数据质量管理
      • 4. 数据版本控制
      • 5. 数据访问控制
    • 元数据管理的实践案例
    • 元数据管理工具介绍
    • 元数据管理的挑战与最佳实践
    • 结论

在这篇文章中,我们将深入探讨元数据管理在数据仓库中的关键作用,以及它如何成为现代大数据开发中不可或缺的一部分。
稿定设计-15.png

什么是元数据?

元数据,顾名思义,就是"关于数据的数据"。它是描述、解释和定位数据的结构化信息。在数据仓库环境中,元数据扮演着至关重要的角色,它就像是数据的"身份证",记录了数据的来源、格式、含义、关系和使用方法等信息。

让我们通过一个简单的例子来理解元数据:

假设我们有一个名为"sales_data"的数据表,其中包含以下列:

CREATE TABLE sales_data (
    transaction_id INT,
    date DATE,
    product_id VARCHAR(10),
    quantity INT,
    price DECIMAL(10,2),
    customer_id INT
);

这个表的元数据可能包括:

  • 表名: sales_data
  • 列名及其数据类型:
    • transaction_id (INT)
    • date (DATE)
    • product_id (VARCHAR)
    • quantity (INT)
    • price (DECIMAL)
    • customer_id (INT)
  • 创建日期: 2024-03-15
  • 最后更新日期: 2024-08-31
  • 数据来源: POS系统
  • 更新频率: 每日
  • 负责人: John Doe
  • 描述: 该表存储了所有销售交易的详细信息

这些信息就构成了"sales_data"表的元数据,它们描述了这个数据集的结构、内容和上下文。
image.png

元数据管理的重要性

在数据仓库中,元数据管理的重要性怎么强调都不为过。它就像是数据仓库的"导航系统",没有它,我们就会在海量数据中迷失方向。以下是元数据管理的几个关键作用:

  1. 数据治理: 元数据是实现有效数据治理的基础。它helps确保数据的一致性、准确性和可靠性。

  2. 数据血缘追踪: 元数据可以帮助我们追踪数据的来源和流动路径,这对于理解数据的生命周期和影响分析至关重要。

  3. 提高效率: 通过元数据,数据工程师和分析师可以快速找到并理解他们需要的数据,大大提高工作效率。

  4. 促进协作: 元数据提供了一个共同的语言和参考点,有助于不同团队之间的沟通和协作。

  5. 支持自助服务: 良好的元数据管理可以支持自助式的数据发现和分析,让业务用户能够更自主地使用数据。

  6. 确保合规性: 元数据管理helps确保数据使用符合各种法规和公司政策。

  7. 优化性能: 通过元数据,我们可以识别数据访问模式,从而优化查询性能和存储策略。

让我们通过一个具体的场景来说明元数据管理的重要性:

假设你是一家电子商务公司的数据分析师,你的任务是分析过去一年中各种促销活动对销售的影响。没有proper的元数据管理,你可能面临以下困境:

  • 你不知道哪些表包含销售数据和促销活动信息。
  • 即使找到了相关的表,你也不清楚字段的具体含义。
  • 你不确定数据的更新频率,可能使用了过时的数据。
  • 你无法确定数据的来源是否可靠。
  • 你不知道谁是这些数据的负责人,无法解答你的疑问。

反之,如果有完善的元数据管理:

  • 你可以快速找到"sales_transactions"和"promotion_events"表。
  • 你了解每个字段的含义,知道"promo_code"字段链接了这两个表。
  • 你知道销售数据每天更新,促销活动数据每周更新。
  • 你可以追踪数据的来源,确保其可靠性。
  • 你知道数据的负责人是市场部的Jane,可以直接联系她解答疑问。

这个例子清楚地展示了元数据管理如何显著提高数据分析的效率和准确性。
image.png

元数据在数据仓库中的类型

在数据仓库中,元数据通常可以分为三种主要类型:

  1. 技术元数据
  2. 业务元数据
  3. 操作元数据
    image.png

让我们详细探讨每种类型,并通过实例来理解它们的作用:

1. 技术元数据

技术元数据描述了数据的技术特征,包括数据结构、格式、存储位置等。它主要服务于IT和数据工程团队。

示例:

{
  "table_name": "customer_orders",
  "database": "sales_mart",
  "schema": "public",
  "columns": [
    {
      "name": "order_id",
      "data_type": "INT",
      "is_nullable": false,
      "is_primary_key": true
    },
    {
      "name": "customer_id",
      "data_type": "INT",
      "is_nullable": false,
      "foreign_key": {
        "references": "customers.customer_id"
      }
    },
    {
      "name": "order_date",
      "data_type": "DATE",
      "is_nullable": false
    },
    {
      "name": "total_amount",
      "data_type": "DECIMAL(10,2)",
      "is_nullable": false
    }
  ],
  "partition_key": "order_date",
  "storage_format": "Parquet",
  "location": "s3://my-data-warehouse/sales_mart/customer_orders/"
}

这个例子展示了"customer_orders"表的技术元数据,包括表名、所属数据库和schema、列定义、主外键关系、分区键、存储格式和位置等信息。这些信息对于数据工程师进行数据建模、优化查询性能和管理数据生命周期至关重要。

2. 业务元数据

业务元数据从业务角度描述数据,包括业务术语定义、数据所有者、数据用途等。它主要服务于业务分析师和决策者。

示例:

table: customer_orders
business_definition: "记录客户订单的详细信息,用于销售分析和客户行为研究"
data_owner: "Sarah Johnson (销售部门主管)"
update_frequency: "每日更新"
data_quality_rules:
  - "total_amount必须大于0"
  - "order_date不能晚于当前日期"
key_business_terms:
  order_id: "唯一标识每个订单的编号"
  customer_id: "与customers表关联的客户唯一标识符"
  order_date: "订单创建的日期"
  total_amount: "订单的总金额,包含税费和运费"
usage:
  - "每日销售报表"
  - "客户终生价值(LTV)计算"
  - "销售预测模型"
sensitivity: "中等 (包含客户交易信息)"
retention_period: "7年"

这个业务元数据示例提供了"customer_orders"表的业务上下文,包括表的业务定义、数据所有者、更新频率、数据质量规则、关键业务术语解释、数据用途、敏感度和保留期限等信息。这些信息帮助业务用户理解数据的含义和重要性,从而更好地利用数据进行决策。

3. 操作元数据

操作元数据记录了数据处理和使用的历史信息,包括数据加载时间、处理状态、访问日志等。它主要用于监控和审计。

示例:

{
  "table": "customer_orders",
  "etl_jobs": [
    {
      "job_name": "daily_customer_orders_load",
      "last_run_time": "2024-08-30 23:15:00",
      "status": "SUCCESS",
      "records_processed": 15243,
      "execution_time": "00:05:23"
    }
  ],
  "data_quality_checks": [
    {
      "check_name": "total_amount_positive",
      "last_run_time": "2024-08-31 00:00:00",
      "status": "PASSED",
      "failed_records": 0
    },
    {
      "check_name": "order_date_valid",
      "last_run_time": "2024-08-31 00:00:00",
      "status": "FAILED",
      "failed_records": 3,
      "error_message": "3 records have order_date in the future"
    }
  ],
  "access_logs": [
    {
      "user": "data_analyst_1",
      "query": "SELECT * FROM customer_orders WHERE order_date > '2024-08-01'",
      "timestamp": "2024-08-31 09:23:15",
      "rows_returned": 5621
    }
  ],
  "last_backup": "2024-08-31 01:00:00",
  "current_size": "1.2 TB"
}

这个操作元数据示例记录了"customer_orders"表的各种操作信息,包括ETL作业执行情况、数据质量检查结果、用户访问日志、最后备份时间和当前表大小等。这些信息有助于监控数据处理流程,识别潜在问题,进行性能优化和安全审计。

通过这三种类型的元数据,我们可以全面了解数据仓库中的数据资产,从技术实现到业务含义,再到日常运营,无一遗漏。这不仅提高了数据管理的效率,也为数据的有效利用奠定了基础。

元数据管理的核心功能

元数据管理系统在数据仓库中扮演着多重角色,提供了一系列核心功能。让我们深入探讨这些功能,并通过具体的例子来说明它们的重要性:
image.png

1. 数据目录

数据目录是元数据管理的基础,它提供了数据仓库中所有数据资产的全面视图。

示例:

假设我们有一个名为"DataCatalog"的系统,它可能提供如下的interface:

class DataCatalog:
    def search_data_assets(self, keyword):
        # 根据关键词搜索数据资产
        pass

    def get_asset_details(self, asset_id):
        # 获取特定数据资产的详细信息
        pass

    def list_recent_changes(self):
        # 列出最近的数据资产变更
        pass

# 使用示例
catalog = DataCatalog()

# 搜索包含"customer"的数据资产
results = catalog.search_data_assets("customer")
for result in results:
    print(f"Found: {result.name} - {result.description}")

# 获取特定资产的详细信息
asset = catalog.get_asset_details("customer_orders")
print(f"Table: {asset.name}")
print(f"Columns: {', '.join(asset.columns)}")
print(f"Last updated: {asset.last_updated}")

# 列出最近的变更
changes = catalog.list_recent_changes()
for change in changes:
    print(f"{change.timestamp}: {change.asset_name} was {change.action}")

这个数据目录系统允许用户轻松搜索和浏览数据资产,查看详细信息,并跟踪最近的变更。这大大提高了数据发现的效率,让用户能够快速找到他们需要的数据。

2. 数据血缘分析

数据血缘分析帮助我们理解数据的来源和流动路径,这对于影响分析和问题排查至关重要。

示例:

考虑一个名为"DataLineage"的系统,它可能提供如下的功能:

class DataLineage:
    def get_upstream_assets(self, asset_id):
        # 获取给定资产的上游数据资产
        pass

    def get_downstream_assets(self, asset_id):
        # 获取给定资产的下游数据资产
        pass

    def visualize_lineage(self, asset_id):
        # 可视化数据血缘关系
        pass

# 使用示例
lineage = DataLineage()

# 获取customer_lifetime_value表的上游资产
upstream = lineage.get_upstream_assets("customer_lifetime_value")
print("Upstream assets:")
for asset in upstream:
    print(f"- {asset.name} ({asset.type})")

# 获取customer_orders表的下游资产
downstream = lineage.get_downstream_assets("customer_orders")
print("Downstream assets:")
for asset in downstream:
    print(f"- {asset.name} ({asset.type})")

# 可视化customer_segmentation表的血缘关系
lineage.visualize_lineage("customer_segmentation")

这个数据血缘分析系统允许用户追踪数据的来源和去向,有助于理解数据流转过程、进行影响分析和问题排查。例如,如果customer_lifetime_value表出现异常,我们可以快速查看其上游资产,定位可能的问题源头。

3. 数据质量管理

元数据管理系统通常包含数据质量规则的定义和执行结果,帮助确保数据的准确性和一致性。

示例:

class DataQualityManager:
    def define_quality_rule(self, asset_id, rule):
        # 为数据资产定义质量规则
        pass

    def run_quality_check(self, asset_id):
        # 执行数据质量检查
        pass

    def get_quality_report(self, asset_id):
        # 获取数据质量报告
        pass

# 使用示例
dq_manager = DataQualityManager()

# 定义数据质量规则
dq_manager.define_quality_rule("customer_orders", {
    "rule_name": "valid_order_amount",
    "condition": "total_amount > 0",
    "severity": "high"
})

# 运行数据质量检查
dq_manager.run_quality_check("customer_orders")

# 获取质量报告
report = dq_manager.get_quality_report("customer_orders")
print(f"Data Quality Report for customer_orders:")
print(f"Total records: {report.total_records}")
print(f"Passed records: {report.passed_records}")
print(f"Failed records: {report.failed_records}")
for rule in report.failed_rules:
    print(f"- Rule '{rule.name}' failed: {rule.failure_reason}")

这个数据质量管理系统允许用户定义数据质量规则,执行质量检查,并获取详细的质量报告。这有助于及时发现和解决数据问题,确保数据分析的准确性。

4. 数据版本控制

元数据管理系统还可以帮助跟踪数据的版本变化,尤其是在schema变更或数据回溯的情况下。

示例:

class DataVersionControl:
    def create_version(self, asset_id, version_info):
        # 创建数据资产的新版本
        pass

    def list_versions(self, asset_id):
        # 列出数据资产的所有版本
        pass

    def compare_versions(self, asset_id, version1, version2):
        # 比较两个版本的差异
        pass

# 使用示例
version_control = DataVersionControl()

# 创建新版本
version_control.create_version("customer_profile", {
    "version": "2.0",
    "changes": "Added column 'loyalty_score'"
})

# 列出版本
versions = version_control.list_versions("customer_profile")
for version in versions:
    print(f"Version {version.number}: {version.description}")

# 比较版本
diff = version_control.compare_versions("customer_profile", "1.0", "2.0")
print("Changes between version 1.0 and 2.0:")
for change in diff:
    print(f"- {change.type}: {change.description}")

这个数据版本控制系统允许用户管理数据资产的不同版本,跟踪变更历史,并进行版本比较。这对于理解数据演变过程、进行数据回溯分析和确保数据一致性非常有用。

5. 数据访问控制

元数据管理系统通常与数据访问控制集成,帮助实施数据安全策略。

示例:

class DataAccessControl:
    def set_access_policy(self, asset_id, policy):
        # 设置数据资产的访问策略
        pass

    def check_access(self, user_id, asset_id, operation):
        # 检查用户是否有权限执行特定操作
        pass

    def audit_access(self, asset_id):
        # 审计数据资产的访问记录
        pass

# 使用示例
access_control = DataAccessControl()

# 设置访问策略
access_control.set_access_policy("customer_pii", {
    "read": ["data_analyst", "data_scientist"],
    "write": ["data_engineer"],
    "delete": ["data_admin"]
})

# 检查访问权限
user_id = "john_doe"
asset_id = "customer_pii"
operation = "read"
if access_control.check_access(user_id, asset_id, operation):
    print(f"User {user_id} has {operation} access to {asset_id}")
else:
    print(f"Access denied for user {user_id} to {operation} {asset_id}")

# 审计访问记录
audit_logs = access_control.audit_access("customer_pii")
for log in audit_logs:
    print(f"{log.timestamp}: User {log.user_id} performed {log.operation} on {log.asset_id}")

这个数据访问控制系统允许管理员设置精细的访问策略,检查用户权限,并审计访问记录。这有助于保护敏感数据,确保合规性,并提供全面的安全审计能力。

元数据管理的实践案例

让我们通过一个综合性的案例来看看元数据管理如何在实际的数据仓库项目中发挥作用。

场景:
假设你是一家大型电子商务公司的数据架构师,负责构建和管理公司的数据仓库。公司最近启动了一个客户360项目,旨在整合所有客户相关的数据,为营销和客户服务部门提供全面的客户视图。

实施步骤:

  1. 数据资产inventory

首先,你需要identif所有与客户相关的数据资产。使用数据目录功能,你可以快速搜索和列出这些资产:

catalog = DataCatalog()
customer_assets = catalog.search_data_assets("customer")

print("Customer-related data assets:")
for asset in customer_assets:
    print(f"- {asset.name} ({asset.type}): {asset.description}")

输出可能类似:

Customer-related data assets:
- customer_profile (Table): Basic customer information
- customer_orders (Table): Customer order history
- customer_support_tickets (Table): Customer support interactions
- customer_browsing_history (Stream): Real-time customer website activity
- customer_email_interactions (Table): Customer email communication records
  1. 数据血缘分析

接下来,你需要理解这些数据资产之间的关系。使用数据血缘分析工具:

lineage = DataLineage()
lineage.visualize_lineage("customer_360_view")

这可能会生成一个可视化图表,显示customer_360_view是如何从各个源数据表汇总而来的。

  1. 数据质量管理

为了确保客户360视图的准确性,你需要为每个相关的数据资产定义数据质量规则:

dq_manager = DataQualityManager()

dq_manager.define_quality_rule("customer_profile", {
    "rule_name": "valid_email",
    "condition": "email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}$'",
    "severity": "high"
})

dq_manager.define_quality_rule("customer_orders", {
    "rule_name": "order_amount_positive",
    "condition": "total_amount > 0",
    "severity": "critical"
})

# 运行数据质量检查
dq_manager.run_quality_check("customer_profile")
dq_manager.run_quality_check("customer_orders")

# 获取质量报告
profile_report = dq_manager.get_quality_report("customer_profile")
orders_report = dq_manager.get_quality_report("customer_orders")

print("Data Quality Report Summary:")
print(f"customer_profile - Pass rate: {profile_report.pass_rate}%")
print(f"customer_orders - Pass rate: {orders_report.pass_rate}%")
  1. 数据版本控制

在整合客户数据的过程中,你可能需要对某些表进行schema变更。使用数据版本控制来管理这些变更:

version_control = DataVersionControl()

# 记录customer_profile表的schema变更
version_control.create_version("customer_profile", {
    "version": "2.0",
    "changes": "Added columns: loyalty_score, last_interaction_date"
})

# 比较版本差异
diff = version_control.compare_versions("customer_profile", "1.0", "2.0")
print("Changes in customer_profile schema:")
for change in diff:
    print(f"- {change.type}: {change.description}")
  1. 数据访问控制

最后,你需要确保只有授权人员能访问敏感的客户数据:

access_control = DataAccessControl()

# 设置客户PII数据的访问策略
access_control.set_access_policy("customer_pii", {
    "read": ["marketing_analyst", "customer_service_rep"],
    "write": ["data_engineer"],
    "delete": ["data_admin"]
})

# 审计访问记录
audit_logs = access_control.audit_access("customer_pii")
print("Recent access to customer PII data:")
for log in audit_logs[-5:]:  # 显示最近5条记录
    print(f"{log.timestamp}: User {log.user_id} performed {log.operation}")

通过这个综合案例,我们可以看到元数据管理如何贯穿整个数据仓库项目的生命周期,从数据资产的identif和理解,到质量控制、版本管理,再到安全访问控制。这不仅提高了数据管理的效率,也确保了数据的质量和安全性,为客户360项目的成功实施奠定了坚实的基础。

元数据管理工具介绍

image.png

在实际的数据仓库项目中,我们通常会使用专门的元数据管理工具来实现上述功能。以下是几个流行的开源和商业元数据管理工具:

  1. Apache Atlas

Apache Atlas是一个开源的元数据管理和治理平台,专为Hadoop生态系统设计,但也可以与其他数据平台集成。

主要特性:

  • 灵活的元数据模型
  • 数据分类和血缘分析
  • 集成的安全和数据治理
  • RESTful API for扩展性

示例用法:

# 使用Atlas CLI创建一个新的数据资产
atlas entity create --type hive_table --name customer_profile --attributes "{ \"owner\": \"data_team\", \"createTime\": \"2024-08-31\" }"

# 查询数据资产
atlas entity show --guid <entity_guid>

# 查看数据血缘
atlas lineage <entity_guid> --direction BOTH
  1. Amundsen

Amundsen是Lyft开发的开源元数据引擎,专注于数据发现和数据治理。

主要特性:

  • 数据搜索和发现
  • 数据血缘可视化
  • 集成多种数据源(Hive, Presto, Redshift等)
  • 用户友好的Web界面

示例用法:
Amundsen主要通过Web界面使用,但也提供了API:

from amundsen_client.client import AmundsenClient

client = AmundsenClient()

# 搜索表
search_results = client.search_table(query='customer')

# 获取表元数据
table_metadata = client.get_table_metadata(database='my_database', cluster='my_cluster', schema='public', table_name='customer_profile')

# 获取列描述
column_descriptions = client.get_column_description(table_uri='my_database://my_cluster.public/customer_profile')
  1. Collibra

Collibra是一个商业数据智能平台,提供全面的数据目录和治理功能。

主要特性:

  • 企业级数据目录
  • 业务词汇表管理
  • 数据血缘和影响分析
  • 强大的工作流引擎

示例用法:
Collibra主要通过图形界面使用,但也提供了API:

from collibra_core import ApiClient, Configuration
from collibra_core.api import asset_api

# 设置API客户端
config = Configuration()
config.host = "https://my-collibra-instance.com/rest/2.0"
config.username = "your_username"
config.password = "your_password"

client = ApiClient(configuration=config)
api_instance = asset_api.AssetApi(client)

# 搜索资产
search_results = api_instance.search_assets(offset=0, limit=10, name_match_mode="ANYWHERE", name="customer")

# 获取资产详情
asset_details = api_instance.get_asset(asset_id="your_asset_id")
  1. Alation

Alation是另一个流行的商业数据目录和元数据管理平台,特别适合大型企业。

主要特性:

  • 智能数据目录
  • 协作式数据治理
  • 机器学习驱动的数据洞察
  • 与主流BI工具集成

Alation主要通过Web界面使用,但也提供API接口。由于是商业产品,具体使用方法需要参考其官方文档。

元数据管理的挑战与最佳实践

image.png

在实施元数据管理时,我们可能会遇到一些挑战。以下是一些常见挑战及其对应的最佳实践:

  1. 数据volume和复杂性

    • 挑战: 随着数据量的增加和数据结构的复杂化,元数据管理变得越来越困难。
    • 最佳实践: 采用自动化的元数据收集和更新机制,利用机器学习技术辅助元数据生成和维护。
  2. 元数据质量

    • 挑战: 确保元数据的准确性和全面性。
    • 最佳实践: 建立元数据质量检查机制,定期审核和更新元数据,鼓励数据用户参与元数据维护。
  3. 标准化和一致性

    • 挑战: 在不同系统和团队间保持元数据的一致性。
    • 最佳实践: 制定并执行企业级的元数据标准,使用统一的元数据管理平台。
  4. 用户采用

    • 挑战: 让数据用户习惯使用元数据管理系统。
    • 最佳实践: 提供用户友好的界面,集成到现有的数据工作流程中,开展培训和宣传活动。
  5. 安全性和合规性

    • 挑战: 在提供便利访问的同时确保数据安全和隐私。
    • 最佳实践: 实施细粒度的访问控制,加强审计日志记录,确保元数据管理系统符合相关法规要求。

结论

image.png

元数据管理在现代数据仓库中扮演着至关重要的角色。它不仅帮助我们理解、组织和管理复杂的数据资产,还为数据治理、数据质量管理和数据安全提供了坚实的基础。通过本文的探讨,我们可以看到:

  1. 元数据管理提供了数据的"导航系统",帮助用户快速发现和理解数据。
  2. 数据血缘分析使我们能够追踪数据的来源和影响,这对于确保数据的可靠性和解决数据问题至关重要。
  3. 元数据管理支持数据质量控制,帮助维护高质量的数据资产。
  4. 版本控制和变更管理功能使我们能够跟踪数据结构的演变,支持数据回溯分析。
  5. 集成的访问控制和审计功能增强了数据安全性和合规性。

在实施元数据管理时,我们需要选择适合的工具,建立相应的流程,并培养组织的元数据文化。虽然过程中可能面临挑战,但通过采用最佳实践和持续改进,我们可以充分发挥元数据管理的价值,为数据驱动的决策提供强有力的支持。

随着人工智能和机器学习技术的发展,未来的元数据管理将变得更加智能和自动化,进一步提升数据管理的效率和效果。作为数据专业人士,我们应该持续关注这一领域的发展,不断优化我们的元数据管理实践。

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

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

相关文章

Open3D mesh Taubin滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 参数详解 返回值 2.2完整代码 三、实现效果 3.1加入噪声的mesh 3.2Taubin迭代10次 3.3Taubin迭代100次 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云…

【学习笔记】卫星通信发展趋势

卫星通信系统是融合现代通信技术、航天技术与计算机技术的综合应用&#xff0c;已成为国际与国内通信、国防、移动通信及广播电视领域的关键基础设施。基于其频带宽度大、通信容量高、业务兼容性强、覆盖范围广、性能稳定、地理条件适应性高及成本与距离无关等特性&#xff0c;…

猫咪浮毛不再乱飞 希喂、霍尼韦尔、352宠物空气净化器功能实测

“你真的养猫了吗&#xff1f;为什么一点也看不出来&#xff1f;”养宠以来我经常收到这样的提问&#xff0c;原因是另一位铲屎官身上总会时不时出现猫咪毛发&#xff0c;标记着他的身份。哪有不会掉毛的猫咪呢&#xff0c;何况到了夏天&#xff0c;换毛季的掉毛量更是惊人。其…

KTV开台源码--SAAS本地化及未来之窗行业应用跨平台架构

一、ktv开台源码 function 未来之窗_人工智能_KTV开台(title,桌台id,类型id,类型名称){var 未来之窗app_通用ID"未来之城激光加工机";var 未来之窗_人工智能_内容 tpl_未来之窗_模板_KTV开单;CyberWin_Dialog.layer(未来之窗_人工智能_内容,{type:"frame",…

Kubernetes 网关流量管理:Ingress 与 Gateway API

引言 随着 Kubernetes 在云原生领域的广泛使用&#xff0c;流量管理成为了至关重要的一环。为了有效地管理从外部流入集群的流量&#xff0c;Kubernetes 提供了多种解决方案&#xff0c;其中最常见的是 Ingress 和新兴的 Gateway API。 Ingress 随着微服务架构的发展&#x…

【手撕数据结构】二叉树的性质

目录 叶子节点和边的性质概念小试牛刀 叶子节点和边的性质 概念 可以看到度为0的节点如F没有边&#xff0c;度为1的节点如C有一条边&#xff0c;而度为2的节点如B有两条边。那么设度为2的节点为a个&#xff0c;度为1的节点为b个。二叉树边 2ab另⼀⽅⾯&#xff0c;由于共有 a…

反激式开关电源(硬件面试86题 电源专栏)

在硬件面试经典中的第 86 题中提到的反激式开关电源&#xff0c;是通过开关通断将交流转变成直流的 AD-DC 开关电源的一种&#xff0c;并且反激式开关电源是由 BUCK-BOOST 电路演变而来&#xff0c;所以博客由浅入深一步一步讲解完反激式开关的知识&#xff0c;让我们开始吧&am…

未使用CMSIS之前的stm32标准库中SystemHandler的宏定义

背景&#xff1a; 在stm32的标准库还叫STM32F10xxx_FWLib_V2.0.3的那个年代 文件 STM32F10xFWLib_V2.0.3/FWLib/library/inc/stm32f10x_nvic.h 中有对System Handlers的定义。具体内容如下&#xff1a; /* System Handlers -------------------------------------------------…

【Python】2.基础语法(2)

文章目录 1.顺序语句2.条件语句2.1语法格式2.1.1 if2.1.2 if - else2.1.3 if - elif - else 2.2缩进和代码块2.3 空语句 pass 3. 循环语句3.1 while 循环3.2 for 循环3.3 continue3.4 break 4. 综合案例4.1 设置初始属性4.2 设置性别4.3 设置出生点4.4 针对每一岁, 生成人生经历…

【MySQL】主键优化原理篇——【数据组织方式&主键顺序插入&主键乱序插入&页分裂&页分裂】

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

AI搜索:重塑信息获取的新纪元

在信息爆炸的时代&#xff0c;如何快速、准确地获取所需信息成为了每个人面临的挑战。传统的搜索引擎虽然在一定程度上解决了这一问题&#xff0c;但广告干扰、结果冗余、内容质量参差不齐等问题仍让用户体验大打折扣。随着AI技术的不断发展&#xff0c;AI搜索产品以其独特的优…

【软件测试】bug以及测试用例的设计方法

系列文章目录 第一章 【软件测试】常见的开发模型和测试模型 文章目录 系列文章目录前言一、bug的基本要素。二、bug的处理流程三、弱网测试四、设计方法1.基于需求的设计方法2.具体的测试方法&#xff08;1&#xff09;等价类划分法&#xff08;2&#xff09;边界值分析法&am…

Serilog文档翻译系列(三) - 基础配置

Serilog 使用简单的 C# API 来配置日志记录。当需要外部配置时&#xff0c;可以&#xff08;慎用&#xff09;通过使用 Serilog.Settings.AppSettings 包或 Serilog.Settings.Configuration 包进行混合配置。 创建日志记录器 日志记录器是通过 LoggerConfiguration 对象创建的…

STM32硬件篇:W25Q64

W25Q64简介 W25Qxx系列是一种低成本、小型化、使用简单&#xff08;使用SPI通信协议&#xff09;的非易失性&#xff08;掉电不丢失&#xff09;存储器&#xff0c;常用于数据存储、字库存储、固件程序存储等场景。 【注意】W25Qxx芯片只支持SPI的模式0和模式3。 存储介质&am…

【单片机开发】IAP技术详解及应用

【前言】 在单片机开发过程中&#xff0c;程序的烧录是一个至关重要的环节。随着技术的不断演进&#xff0c;单片机烧录方式也日益多样化。 【单片机开发】单片机的烧录方式详解&#xff08;ICP、IAP、ISP&#xff09;-CSDN博客文章浏览阅读775次&#xff0c;点赞14次&#x…

kali系统学习笔记1

收集DSN相关信息命令 1、ping IP/URL 例如 ping 153.3.238.110 ping www.baidu.com2、nslookup 域名 例如 nslookup www.baidu.com3、dig URL //查询域名正向解析 dig www.baidu.com //查询域名所有解析&#xff08;正向、反向&#xff09; dig www.baidu.com any//通过指…

江协科技stm32————11-1SPI通信协议

目录 SPI通信 硬件电路 移位示意图 SPI时序基本单元 模式0 模式1 SPI时序 发送指令 指定地址写 指定地址读 SPI通信 四根通信线&#xff1a; SCK&#xff08;Serial Clock&#xff09;&#xff1a;串行时钟线 MOSI&#xff08;Master Output Slave Input&#xff09…

书生大模型实战营闯关记录----第十一关:LMDeploy 量化部署进阶实践 KV cache量化部署,W4A16 模型量化和部署

文章目录 1 配置LMDeploy环境1.1 环境搭建1.2 InternStudio环境获取模型1.3 LMDeploy验证启动模型文件 2 LMDeploy与InternLM2.5 2.1 LMDeploy API部署InternLM2.52.1.1 启动API服务器 2.1.2 以命令行形式连接API服务器 2.1.3 以Gradio**网页形式连接API服务器** 2.2 LMDeploy…

使用developer command prompt查看代码信息

1.在Visual Studio里面写入以下的代码&#xff0c;命名为Myproject #include <iostream>template<typename T> T Sub(T a, T b) {return a - b; } int main() {int x 1, y 2;int z Sub(x, y);double a 1.0, b 2.0;double c Sub(a, b);return 0; }2.打开dev…

在VBA中,对Excel单元格的操作方法 (qo+op)

一、读取单元格内容 读取单元格的内容&#xff0c;将单元格的值赋给一个变量。例如&#xff0c;读取A1单元格的内容并打印到窗口。 Sub Cell() Dim cellContent As String cellContent Worksheets("Sheet1").Range("A1").Value Debug.Print cellContent …