Apache Doris EXPLODE函数:行转列核心原理、实战与性能优化
1. 从“一行多值”到“一行一值”为什么我们需要Explode在数据处理的日常里我经常遇到一种让人头疼的数据结构一个字段里塞了一堆值。比如用户标签字段存的是“科技,数码,摄影”订单商品字段存的是“SKU001,SKU002,SKU003”或者日志里一个事件ID对应多个属性值。这种设计在存储时看似省事但到了分析环节麻烦就来了。你想统计每个标签的用户数或者分析每个商品的销售情况用传统的SQL去处理这种“压缩”在一行的数据就像试图用筷子去夹一碗汤——无从下手。这时候行转列Lateral View Explode就成了那把关键的“勺子”。在Apache Doris这类MPP分析型数据库中EXPLODE函数就是实现这一转换的核心武器。它的作用非常直观将一个包含数组Array或映射Map的列“炸开”让数组中的每个元素、映射中的每个键值对都生成独立的一行数据。原本“一行多值”的紧凑结构被展开成“一行一值”的明细结构后续的过滤、分组、聚合等操作就变得顺理成章。我最初接触EXPLODE是在处理用户行为序列时。当时用户的一次会话路径被记录为一个数组[‘page_view’, ‘add_to_cart’, ‘payment’]。如果我想计算每个步骤的转化率不把数组展开几乎无法进行。EXPLODE完美地解决了这个问题它让隐藏在复合结构里的细节数据得以“见光”为深度分析铺平了道路。理解并掌握这个函数是从“会写SQL”到“能用SQL高效解决复杂问题”的关键一步。2. EXPLODE函数深度解析不只是“炸开”那么简单EXPLODE函数的概念听起来简单但它的内部机制和适用边界是决定我们能否用好它的关键。很多人以为它就是个简单的循环展开其实不然。2.1 EXPLODE的工作原理与执行逻辑在Doris中EXPLODE是一个表值函数Table-Valued Function, TVF。这意味着它不像SUM()或SUBSTRING()那样返回一个标量值而是返回一个虚拟的表多行数据。当你在一个查询的FROM子句中使用LATERAL VIEW配合EXPLODE时Doris会为原始表中的每一行都执行一次EXPLODE操作。举个例子假设有一张表user_tagsuser_idtags1001[‘大数据’, ‘Java’]1002[‘Python’, ‘AI’, ‘算法’]执行以下查询SELECT user_id, tag FROM user_tags LATERAL VIEW EXPLODE(tags) tmp AS tag;Doris的处理逻辑是这样的读取第一行user_id1001, tags[‘大数据’, ‘Java’]。对tags数组应用EXPLODE生成两行虚拟数据(‘大数据’)和(‘Java’)。将原始行的user_id (1001)分别与这两行虚拟数据连接Join得到结果行(1001, ‘大数据’)和(1001, ‘Java’)。对第二行重复此过程生成三行数据。最终输出一个包含5行的结果集。这个过程在数据库内部通常是通过CROSS JOIN笛卡尔积的一种特殊形式和生成函数Generator来实现的。LATERAL VIEW关键字是关键它允许右侧的表达式EXPLODE(tags)引用左侧表user_tags中当前行的列值。这种“逐行关联展开”的能力是行转列的核心。2.2 处理Array与Map两种数据结构的展开策略EXPLODE主要处理两种复杂类型ARRAY和MAP。它们的展开方式有细微差别需要特别注意。对于ARRAY类型这是最常用的场景。EXPLODE会将数组中的每个元素变成一行。除了元素值我们有时还需要知道这个元素在数组中的位置下标。这时可以使用POSEXPLODE函数。-- 使用EXPLODE只展开值 SELECT user_id, tag FROM user_tags LATERAL VIEW EXPLODE(tags) tmp AS tag; -- 使用POSEXPLODE同时展开值和位置索引从0开始 SELECT user_id, pos, tag FROM user_tags LATERAL VIEW POSEXPLODE(tags) tmp AS pos, tag;结果中pos列就是该标签在原始数组中的索引。这在分析序列数据如用户点击流顺序时非常有用。对于MAP类型EXPLODE会将一个Map拆分成多行每行包含一个键Key和一个值Value。如果你需要分别展开键和值可以使用EXPLODE_KEYS和EXPLODE_VALUES但更常见的做法是直接用EXPLODE展开成两列。-- 假设有一张表 user_prefs, prefs 是 MAPString, String 类型 -- 例如{‘theme’: ‘dark’, ‘language’: ‘zh-CN’} SELECT user_id, pref_key, pref_value FROM user_prefs LATERAL VIEW EXPLODE(prefs) tmp AS pref_key, pref_value;这里EXPLODE为每个键值对生成一行pref_key和pref_value分别对应键和值。注意一个常见的误区是试图对非数组/Map的列使用EXPLODE比如一个用逗号分隔的字符串‘a,b,c’。直接EXPLODE会报错。正确的做法是先用split()函数将其转换为数组EXPLODE(split(‘a,b,c’, ‘,’))。2.3 性能边界与核心限制什么情况下会“炸”不动EXPLODE虽好但不能无节制使用。它本质上是将数据膨胀如果原始数组很长或者数据量很大会产生巨大的中间结果对内存和计算造成巨大压力。Doris对此有明确的限制。最著名的错误就是doris exceeded the maximum children of an expression tree (10000).。这个错误并不直接源于EXPLODE但经常在复杂查询中伴随EXPLODE出现。它指的是Doris对单个查询计划树中表达式节点的数量有上限默认10000。当你对一个超大的数组进行EXPLODE或者嵌套使用多个LATERAL VIEW时生成的执行计划可能会异常复杂节点数超过限制而报错。更直接的性能瓶颈在于数据膨胀本身。假设你有一张100万行的表每行有一个平均包含10个元素的数组。经过EXPLODE后临时数据量会膨胀到1000万行。如果后续还有复杂的JOIN或GROUP BY查询很容易变得缓慢甚至因内存不足OOM而失败。我的经验是评估膨胀系数在应用EXPLODE前先用SELECT avg(cardinality(tags)) FROM table估算数组的平均长度。如果平均长度大于10就需要警惕。尽早过滤尽量在EXPLODE之前用WHERE子句过滤掉不需要的行减少被“炸”的数据基数。避免嵌套尽量避免多个LATERAL VIEW EXPLODE的嵌套这会导致膨胀系数相乘。如果必须处理多列数组可以考虑先EXPLODE一个将结果物化成临时表或子查询再处理下一个。关注内存在Doris的FE日志或通过SHOW PROC ‘/current_query’监控查询内存使用。如果EXPLODE后经常OOM可能需要考虑调整BE的内存参数如mem_limit或者从根本上优化数据模型——是否应该在ETL阶段就将数组平铺成明细表3. 实战演练从基础用法到复杂场景拆解理解了原理和边界我们通过一系列由浅入深的例子来看看EXPLODE在真实场景中如何大显身手。我会附带详细的SQL、结果说明以及背后的思考。3.1 场景一用户标签体系的统计分析这是最经典的场景。假设我们有一张user_profile表其中tags字段是ARRAYSTRING存储用户被打上的标签。表结构预览CREATE TABLE user_profile ( user_id BIGINT, user_name VARCHAR(50), tags ARRAYVARCHAR(20) );示例数据user_iduser_nametags1张三[‘高活跃’, ‘VIP’, ‘数码爱好者’]2李四[‘低活跃’, ‘数码爱好者’]3王五[‘高活跃’, ‘游戏玩家’]需求1统计每个标签对应的用户数量。SELECT tag, COUNT(DISTINCT user_id) AS user_count FROM user_profile LATERAL VIEW EXPLODE(tags) tmp AS tag GROUP BY tag ORDER BY user_count DESC;思路与结果EXPLODE将每个用户的标签数组展开使每个标签独占一行并与user_id关联。然后按tag分组统计去重的user_id数。taguser_count数码爱好者2高活跃2VIP1低活跃1游戏玩家1需求2找出同时拥有“高活跃”和“数码爱好者”两个标签的用户。这里有个小陷阱。直接WHERE tag ‘高活跃’ AND tag ‘数码爱好者’在同一行是不成立的因为EXPLODE后一个用户的两行数据。我们需要用到集合思维。SELECT user_id, user_name FROM user_profile WHERE array_contains(tags, ‘高活跃’) AND array_contains(tags, ‘数码爱好者’);思路这个需求实际上不需要EXPLODE。Doris内置的array_contains()函数可以直接在数组上判断元素是否存在效率更高。这提醒我们不是所有数组操作都需要展开先看看有没有原生的数组函数。3.2 场景二订单商品明细的展开与关联电商场景中一个订单可能包含多个商品这些商品ID和数量最初可能以数组或Map形式存储。表结构CREATE TABLE order_summary ( order_id VARCHAR(50), order_date DATE, sku_array ARRAYVARCHAR(20), -- 商品SKU数组 quantity_array ARRAYINT -- 对应数量数组 ); -- 或者更优的设计使用MAP CREATE TABLE order_summary_map ( order_id VARCHAR(50), order_date DATE, sku_quantity_map MAPVARCHAR(20), INT -- SKU - 数量 );示例数据数组形式order_idorder_datesku_arrayquantity_arrayORD0012023-10-27[‘PHONE_X’, ‘CASE_A’][1, 2]ORD0022023-10-27[‘LAPTOP_Y’, ‘PHONE_X’][1, 1]需求展开订单明细并关联商品维度表dim_sku获取商品名称和单价。这里的关键是需要同时展开两个平行的数组并确保它们的对应关系不错位。我们可以使用POSEXPLODE来获取索引或者直接对两个数组分别EXPLODE并关联索引。-- 方法1使用POSEXPLODE一次展开通过索引关联 SELECT o.order_id, o.order_date, o.sku_array[sku_pos] AS sku, -- 通过索引从原数组取值 o.quantity_array[sku_pos] AS quantity FROM order_summary o LATERAL VIEW POSEXPLODE(o.sku_array) tmp AS sku_pos, sku_tmp; -- sku_tmp这里用不上只是为了语法这个方法有点绕且需要依赖数组下标访问。更清晰的做法是使用LATERAL VIEW同时展开两个数组-- 方法2使用两个LATERAL VIEW并通过子查询或CTE确保顺序不推荐易错 -- 方法3更推荐的做法在数据生成时就用MAP或STRUCT存储对应关系 -- 假设我们使用MAP类型的表 order_summary_map SELECT o.order_id, o.order_date, exploded.sku_key AS sku, exploded.sku_value AS quantity, d.sku_name, d.price FROM order_summary_map o LATERAL VIEW EXPLODE(o.sku_quantity_map) tmp AS sku_key, sku_value JOIN dim_sku d ON exploded.sku_key d.sku_id;我的踩坑经验处理平行数组时最安全的方式是在数据接入层如Flink、Spark Streaming就将其转换为MAPSKU, Quantity或ARRAYSTRUCTsku, qty的结构。如果源头已经是两个平行数组我强烈建议在Doris中通过一个视图View或新的物化视图将其预计算成Map结构后续分析会简单可靠得多。强行用EXPLODE处理平行数组极易因数据质量问题导致关联错位产生错误的统计结果。3.3 场景三JSON日志解析与多级展开现代应用日志常以JSON格式存储其中嵌套了数组。Doris支持JSON类型和相关的解析函数结合EXPLODE可以灵活处理。示例日志一条用户事件日志event_params字段是一个JSON字符串其中items是一个数组。{ “user_id”: “u1001”, “event_time”: “2023-10-27 10:00:00”, “event_name”: “purchase”, “event_params”: { “total_amount”: 299.00, “items”: [ {“product_id”: “p1”, “category”: “electronics”, “price”: 199.00}, {“product_id”: “p2”, “category”: “books”, “price”: 100.00} ] } }需求解析JSON并将items数组中的每个商品展开成明细行。-- 假设表 logs 中 event_params 是 JSON 类型 SELECT user_id, event_time, event_name, JSON_EXTRACT_SCALAR(event_params, ‘$.total_amount’) AS total_amount, exploded_item.product_id, exploded_item.category, exploded_item.price FROM logs LATERAL VIEW EXPLODE( CAST( JSON_QUERY(event_params, ‘$.items’) AS ARRAYJSON ) ) tmp AS item_json LATERAL VIEW -- 这里需要将JSON对象进一步解析为列 SELECT JSON_EXTRACT_SCALAR(item_json, ‘$.product_id’) AS product_id, JSON_EXTRACT_SCALAR(item_json, ‘$.category’) AS category, JSON_EXTRACT_SCALAR(item_json, ‘$.price’) AS price ) exploded AS exploded_item WHERE event_name ‘purchase’;思路解析JSON_QUERY(event_params, ‘$.items’)提取出items数组还是一个JSON字符串。CAST(... AS ARRAYJSON)将其转换为Doris能识别的ARRAYJSON类型。第一个EXPLODE将数组展开每行得到一个商品对象的JSON字符串item_json。第二个LATERAL VIEW这里是一个内联的视图对这个JSON字符串进行解析提取出具体的列。重要提示Doris对复杂JSON的处理性能是考量点。如果items数组很大或日志量极大这种实时解析开销很高。对于稳定的日志结构最佳实践是在数据导入时通过json_path等方式直接提取出平铺的列或者使用Doris的JSON类型配合物化视图预计算将解析开销前置。4. 进阶技巧与避坑指南让EXPLODE更高效、更稳定掌握了基本用法我们来看看如何提升EXPLODE使用的“段位”以及如何避开那些常见的“深坑”。4.1 与GROUP BY的结合展开后聚合的优化策略EXPLODE后接GROUP BY是非常常见的模式但也是性能陷阱的高发区。因为EXPLODE大幅增加了数据量随后的GROUP BY需要处理更多行。优化策略1尽可能提前过滤-- 低效先展开所有数据再过滤 SELECT tag, COUNT(*) FROM huge_user_table LATERAL VIEW EXPLODE(tags) tmp AS tag WHERE tag IN (‘热门标签1’, ‘热门标签2’) GROUP BY tag; -- 高效先过滤出需要的行再展开如果WHERE条件不依赖展开的列 SELECT tag, COUNT(*) FROM huge_user_table WHERE array_contains(tags, ‘热门标签1’) OR array_contains(tags, ‘热门标签2’) LATERAL VIEW EXPLODE(tags) tmp AS tag WHERE tag IN (‘热门标签1’, ‘热门标签2’) GROUP BY tag;如果WHERE条件可以直接用数组函数如array_contains在展开前判断就能极大减少输入EXPLODE的数据量。优化策略2考虑使用物化视图Materialized View对于需要频繁统计的标签可以创建一个物化视图预先将EXPLODE和GROUP BY的结果计算好。CREATE MATERIALIZED VIEW tag_user_count_mv BUILD IMMEDIATE REFRESH AUTO ON MANUAL AS SELECT tag, COUNT(DISTINCT user_id) as user_cnt FROM user_profile LATERAL VIEW EXPLODE(tags) tmp AS tag GROUP BY tag;这样查询SELECT * FROM tag_user_count_mv会直接命中预计算好的结果速度极快。但要注意物化视图的维护成本和存储开销。4.2 处理空数组与NULL值避免结果意外消失这是新手最容易忽略的问题。如果一个数组字段是NULL或者空数组[]EXPLODE会如何处理对于NULL数组EXPLODE(NULL)不会产生任何行导致该行原始数据在结果集中完全消失。对于空数组[]EXPLODE([])同样不会产生任何行该行原始数据也会消失。这往往不是我们想要的行为。我们通常希望保留这些行即使它们没有展开的明细。这时就需要用到LATERAL VIEW OUTER EXPLODE。-- 使用 INNER EXPLODE (默认)NULL或空数组的行会消失 SELECT user_id, tag FROM user_profile LATERAL VIEW EXPLODE(tags) tmp AS tag; -- 使用 OUTER EXPLODE保留原始行tag列为NULL SELECT user_id, tag FROM user_profile LATERAL VIEW OUTER EXPLODE(tags) tmp AS tag;OUTER关键字类似于LEFT OUTER JOIN当数组为空或NULL时它会生成一行其中展开的列如tag为NULL但原始表的其他列得以保留。这在做数据完整性检查或需要保留所有用户记录时至关重要。4.3 替代方案评估何时不用EXPLODEEXPLODE不是万能的在某些场景下有更好的替代方案。场景只需要判断数组中是否存在某个元素而不需要展开所有元素。使用array_contains()如前所述性能远优于EXPLODE后再用WHERE过滤。SELECT user_id FROM user_profile WHERE array_contains(tags, ‘VIP’);场景需要聚合数组内的元素如求和、求最大值。使用数组聚合函数Doris提供了array_sum(),array_max(),array_avg()等函数。SELECT order_id, array_sum(quantity_array) as total_quantity FROM order_summary;场景数组长度固定且较小且需要将每个元素作为单独的列输出。使用数组下标直接访问如果数组长度固定为3分别代表上、中、下游。SELECT user_id, tags[1] as primary_tag, -- 注意Doris数组下标从1开始 tags[2] as secondary_tag, tags[3] as tertiary_tag FROM user_profile;这比EXPLODE后再用CASE WHEN或PIVOT转换要高效得多。根本性解决方案重新审视数据模型如果某个数组字段被频繁地EXPLODE用于关联和聚合这本身可能是一个数据模型设计上的“反模式”。在数据仓库维度建模中更规范的做法是设计成事实表维度表的星型模型。将数组元素作为多值维度在ETL过程中就将其平铺成标准的明细事实表。这样所有分析都基于高效的关联模型彻底避免了运行时“爆炸”的开销和复杂性。虽然这增加了ETL的复杂度但对于核心的、高频的分析链路这种预先的规范化设计往往是值得的。5. 从函数到思维行转列在数据建模中的位置最后我想跳出函数本身聊聊EXPLODE背后反映的数据处理思维。EXPLODE是一个强大的“拆弹”工具它能将嵌套的、非标准化的数据拆解成扁平化的、适合SQL二维表模型处理的形式。这体现了数据分析中的一个核心思想将复杂结构转换为简单、可重复的原子事实。然而工具的强大也意味着责任。频繁使用EXPLODE往往是数据模型不够规范的一个信号。在实际项目中我通常会这样决策探索性分析快速使用EXPLODE对原始数据进行探查理解数据分布和关联关系。临时性需求对于一次性的、临时的报表需求使用EXPLODE可以快速满足避免改动ETL流程。低频核心报表如果某个核心报表使用频率不高且EXPLODE的性能在可接受范围内可以保留在查询层。高频核心链路对于每天甚至实时需要跑的核心指标如果涉及EXPLODE我会坚决推动在数据接入或ODS层进行平铺处理物化成一张明细事实表。这可能意味着用Flink/Spark Streaming实时展开或者用Doris的物化视图在入库后异步展开。说到底EXPLODE函数是Doris赋予我们处理半结构化数据的灵活性。但作为一名数据工程师或分析师我们需要在“灵活性”和“性能/成本”之间找到平衡。理解它的原理善用它的技巧知晓它的边界并在合适的时机推动数据模型的优化这才是驾驭这个强大工具的正确方式。在我处理过的一个用户行为分析项目中正是将几个核心的JSON数组字段在数据流中提前展开使得整体查询性能提升了十倍以上而EXPLODE则退位成为我们应对临时需求和历史数据探查的备用方案。

相关新闻

【零售AI推荐系统黄金标准】:基于127家企业的A/B测试数据,定义交叉销售ROI最优阈值

【零售AI推荐系统黄金标准】:基于127家企业的A/B测试数据,定义交叉销售ROI最优阈值

更多请点击: https://codechina.net 第一章:【零售AI推荐系统黄金标准】:基于127家企业的A/B测试数据,定义交叉销售ROI最优阈值 在覆盖快消、服饰、3C及生鲜等多业态的127家零售企业A/B测试中,交叉销售推荐系统的ROI呈…

2026/10/10 14:43:46 阅读更多 →
AI编程思维训练体系(企业级实战框架首次公开):覆盖Prompt工程、抽象建模与LLM协同编码全链路

AI编程思维训练体系(企业级实战框架首次公开):覆盖Prompt工程、抽象建模与LLM协同编码全链路

更多请点击: https://codechina.net 第一章:AI编程思维的本质与演进路径 AI编程思维并非传统软件工程的简单延伸,而是以数据为第一性、以概率为推理基础、以迭代反馈为驱动范式的认知重构。它要求开发者从“精确指令执行者”转向“意图建模者…

2026/10/10 14:46:37 阅读更多 →
仅剩最后217份!银行级AI证件解析SDK内测资格开放(含GB/T 33190-2016标准适配模块)

仅剩最后217份!银行级AI证件解析SDK内测资格开放(含GB/T 33190-2016标准适配模块)

更多请点击: https://intelliparadigm.com 第一章:AI证件信息提取 AI证件信息提取是现代身份核验与自动化办公的核心能力之一,广泛应用于银行开户、政务办理、人力资源入职等场景。其本质是通过计算机视觉(CV)与自然语…

2026/10/10 15:32:21 阅读更多 →

最新新闻

Claude Code Skills配置指南:从项目级到全局迁移

Claude Code Skills配置指南:从项目级到全局迁移

很多人用 Claude Code,第一件事就是把所有要求和背景塞进 CLAUDE.md,规则一条条往上加。等文件写到几百行,日常对话的上下文已经被吃掉一大截,模型反而抓不住重点。后来我把 Claude Code Skills 用起来,思路才算理顺&a…

2026/10/10 15:32:01 阅读更多 →
Qt程序启动报错xcb插件加载失败的原理与全平台排查解决指南

Qt程序启动报错xcb插件加载失败的原理与全平台排查解决指南

Linux下Qt程序打包到别的机器,或者新装系统后第一次跑,经常碰到窗口起不来、终端甩出一行经典的报错:qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.,后面往往…

2026/10/10 15:32:01 阅读更多 →
以太坊执行层深度解析:EVM状态机、Gas本质与ABI编码实操

以太坊执行层深度解析:EVM状态机、Gas本质与ABI编码实操

1. 项目概述:这不是“炒币指南”,而是一份以太坊底层能力的实操解剖报告很多人看到“web3区块链-ETH以太坊”这八个字,第一反应是价格走势图、交易所入口、或者某个代币的白皮书链接。但在我过去三年深度参与多个链上应用开发、智能合约审计和…

2026/10/10 15:32:01 阅读更多 →
AI无法生成内容时,如何优化交互策略

AI无法生成内容时,如何优化交互策略

抱歉,我无法按这个要求生成内容。如果你有其他问题或需要帮助,我很乐意协助。

2026/10/10 15:32:01 阅读更多 →
Codex六成完成率下的开发者人机协作协议

Codex六成完成率下的开发者人机协作协议

1. 这不是AI替代人,而是人重新定义“脏活”的边界“Codex 完成率只有六成,我却把脏活全扔给它”——这句话刚在某技术社区刷屏时,我正盯着一个写了三遍仍被导师打回的接口文档发呆。当时手边开着四个窗口:左侧是GitHub上一份标注着…

2026/10/10 15:32:01 阅读更多 →
火灾烟雾检测数据集2059张+YOLOv5标签转换与训练避坑指南

火灾烟雾检测数据集2059张+YOLOv5标签转换与训练避坑指南

简介:这套火灾烟火烟雾检测数据集面向目标检测、安防监控与火灾预警方向的开发者,提供2059张覆盖大火小火、建筑/草原/森林/车辆起火、白天/黑夜、室内/室外等多样场景的带标签图像,按Pascal VOC格式组织,Annotations中为XML标注&…

2026/10/10 15:31:00 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →