Hive数组操作实战:从基础函数到性能优化全解析
1. 从一次慢查询说起为什么数组操作值得深究最近在排查一个数仓慢SQL作业时遇到了一个典型的性能瓶颈。一个看似简单的报表查询在数据量增长到TB级别后执行时间从几分钟飙升到了几十分钟。通过监控工具和EXPLAIN命令层层剖析最终发现罪魁祸首并非连接JOIN或聚合GROUP BY而是一个隐藏在WHERE子句中对数组字段的array_contains函数调用。这个案例让我再次意识到在Hive这类大数据处理引擎中对数组Array这种复杂数据类型的理解和应用绝非仅仅是语法层面的“会用”其背后的执行逻辑、性能特性和最佳实践直接关系到作业的成败与效率。Hive中的数组本质上是一种有序的元素集合允许你将多个相同类型的值存储在一个字段里。这在处理半结构化或嵌套数据时极为有用比如用户的标签集合、一次会话中的点击事件序列、商品的关联SKU列表等。然而与关系型数据库中规整的扁平表不同数组的引入打破了第一范式带来了灵活性的同时也引入了新的复杂度。如何高效地创建、展开、过滤、聚合数组如何在UDF中处理数组乃至如何规避数组操作带来的性能陷阱这些都是数据开发工程师日常工作中必须面对的课题。本文不会停留在简单的函数罗列而是从一个数据工程师的实战视角出发结合我踩过的坑和优化的经验系统性地拆解Hive中数组的应用。我们将从最基础的构建与访问深入到高频核心函数的场景化解读再探讨性能优化与常见陷阱最后通过一个综合案例串联起数组处理的完整工作流。无论你是正在学习Hive的新手还是希望优化现有作业的老手相信都能从中找到有价值的参考。2. 数组的基石构建、访问与基础变形在深入复杂操作之前我们必须牢牢掌握数组的“基本功”。这包括如何正确地创建数组、如何安全地访问其中的元素以及如何进行最基础的展开与聚合操作。很多初级错误都源于对这些基础概念的理解偏差。2.1 数组的创建与字面量表示在Hive中创建数组主要有两种方式通过内置函数或直接在查询中使用字面量。最常用的创建函数是array()。它接受一系列任意类型的参数但类型必须一致或可隐式转换返回一个数组。-- 创建一个整数数组 SELECT array(1, 2, 3, 4, 5) AS int_array; -- 结果: [1,2,3,4,5] -- 创建一个字符串数组 SELECT array(apple, banana, orange) AS str_array; -- 结果: [apple,banana,orange] -- 创建数组的字段也可以来自其他列或子查询 SELECT user_id, array(collect_set(item_id)) AS purchased_items FROM user_behavior GROUP BY user_id;这里用到了collect_set这个聚合函数它可以将一个分组内的某个字段的值收集到一个去重的集合中返回类型就是数组。这是从扁平数据生成数组的典型方式。另一种更直观的方式是使用字面量。在Hive SQL中你可以直接用方括号[]来定义一个数组常量这在测试或硬编码少量数据时非常方便。SELECT [10, 20, 30] AS fixed_array;需要注意的是在INSERT或CREATE TABLE语句中定义数组字段时需要在数据类型中指明元素类型例如ARRAYINT、ARRAYSTRING。2.2 安全地访问数组元素索引与边界创建了数组接下来就要访问它。Hive数组的索引是从0开始的这与Java、JavaScript等大多数编程语言一致但与某些数据库如SQL Server从1开始不同这一点需要特别注意。使用数组名[索引]的语法可以访问特定位置的元素。SELECT arr[0] AS first_element, arr[2] AS third_element FROM (SELECT array(a, b, c, d) AS arr) t; -- 结果: first_elementa, third_elementc这里隐藏着一个巨大的陷阱数组越界访问。如果你尝试访问一个不存在的索引Hive默认不会报错而是返回NULL。这看似“友好”实则非常危险因为它会悄无声息地将数据中的错误或异常转化为NULL值可能导致后续计算逻辑出现难以察觉的偏差。SELECT arr[10] AS non_exist_element FROM (SELECT array(a, b, c) AS arr) t; -- 结果: non_exist_elementNULL因此在编写涉及数组索引的查询时一个重要的最佳实践是始终先判断数组长度再访问元素。你可以使用size()函数获取数组长度。SELECT arr, size(arr) AS arr_len, -- 安全地访问最后一个元素 IF(size(arr) 0, arr[size(arr)-1], NULL) AS last_element_safe FROM (SELECT array(a, b, c) AS arr) t;2.3 化整为零使用LATERAL VIEW EXPLODE展开数组这是数组操作中最核心、最高频的功能之一。我们经常需要将一行中包含数组的数据转换成多行数据每一行对应数组中的一个元素。这个过程就是“展开”Explode在Hive中通过LATERAL VIEW子句配合explode()函数实现。假设我们有一张用户兴趣表user_interests结构如下user_idinterests (ARRAY )1001[reading, music, hiking]1002[gaming, music]我们希望将每个兴趣拆分成单独的行进行分析SELECT user_id, single_interest FROM user_interests LATERAL VIEW explode(interests) exploded_table AS single_interest;执行结果将是user_idsingle_interest1001reading1001music1001hiking1002gaming1002music关键点解析explode(interests): 这是一个表生成函数UDTF它接收一个数组字段并输出多行每行包含数组中的一个元素。LATERAL VIEW: 这个子句允许你为explode()等UDTF产生的虚拟表关联一个别名exploded_table并可以将其中的列single_interest像普通表列一样在SELECT中使用。原表其他列的保留展开后原表中的其他列如user_id会被保留并复制到每一行新数据中这是LATERAL VIEW机制自动完成的。注意explode()函数有一个重要的限制它不能与其他聚合函数或GROUP BY出现在同一个SELECT列表中。因为explode()会改变行数而聚合操作需要确定的行分组两者在逻辑上冲突。如果需要在展开后聚合通常的做法是先展开到一个子查询或CTE公共表表达式中再对结果进行聚合。2.4 聚零为整使用COLLECT_LIST/SET进行聚合与explode()相反我们有时需要将多行数据聚合成一个数组。Hive提供了两个强大的聚合函数collect_list()和collect_set()。collect_list(): 收集所有值到一个数组保留元素顺序按照数据输入的顺序并允许重复。collect_set(): 收集所有值到一个数组自动去重但不保证元素顺序。场景我们有一张用户购买记录表user_purchases记录了每次购买的商品ID。user_iditem_idpurchase_time1001A0012023-10-011001A0022023-10-021001A0012023-10-031002B0012023-10-01现在我们想为每个用户生成其购买过的所有商品ID列表-- 保留所有购买记录包括重复 SELECT user_id, collect_list(item_id) AS all_purchased_items FROM user_purchases GROUP BY user_id; -- 结果示例 -- user_id1001, all_purchased_items[A001, A002, A001] -- user_id1002, all_purchased_items[B001] -- 只保留去重后的商品ID SELECT user_id, collect_set(item_id) AS distinct_purchased_items FROM user_purchases GROUP BY user_id; -- 结果示例 -- user_id1001, distinct_purchased_items[A001, A002] (顺序不定) -- user_id1002, distinct_purchased_items[B001]关于顺序的坑collect_list的顺序依赖于MapReduce或Tez任务中数据的输入顺序在分布式环境下这个顺序可能不是全局有序的例如按purchase_time排序。如果你需要按某个字段排序后收集一个常见的模式是使用子查询先排序SELECT user_id, collect_list(item_id) AS ordered_items FROM ( SELECT user_id, item_id FROM user_purchases DISTRIBUTE BY user_id SORT BY user_id, purchase_time -- 确保同一个用户的数据在一起并按时间排序 ) sorted GROUP BY user_id;3. 数组处理的核心武器库高频函数场景化解读掌握了基础操作我们来看看Hive提供的一系列数组处理函数。这些函数就像瑞士军刀能解决各种具体问题。我将它们分为查询、操作、排序和高级函数四类并结合典型场景说明。3.1 查询与判断函数这类函数用于检查数组内容返回布尔值或位置信息。array_contains(arr, value): 判断数组arr中是否包含某个值value。这是引发我文章开头那个慢查询的“元凶”但它的使用频率极高。-- 判断用户兴趣中是否包含“music” SELECT user_id, array_contains(interests, music) AS loves_music FROM user_interests;性能警示array_contains在WHERE条件中特别是面对大数组字段时可能无法有效利用分区或索引如果存在导致全表扫描。如果interests字段很大且表数据量巨大这个查询会非常慢。优化方法我们会在第4节详细讨论。size(arr): 返回数组的长度。前面已经提到是安全操作的基础。SELECT user_id, size(interests) AS interest_count FROM user_interests;sort_array(arr): 对数组进行排序升序。注意它返回一个新的排序后的数组不改变原数据。SELECT sort_array(array(3,1,4,1,5)) AS sorted; -- 结果: [1,1,3,4,5] SELECT sort_array(array(banana, apple, cherry)) AS sorted; -- 结果: [apple,banana,cherry]3.2 元素操作与变换函数这类函数用于生成新数组或修改数组内容。concat(array1, array2, ...): 连接多个数组返回一个新数组。SELECT concat(array(1,2), array(3,4), array(5)) AS combined; -- 结果: [1,2,3,4,5]array_union(arr1, arr2),array_intersect(arr1, arr2),array_except(arr1, arr2): 分别返回两个数组的并集、交集和差集arr1有而arr2没有的元素。这些函数非常实用。SELECT array_union(array(1,2,3), array(2,3,4)) AS union_arr, -- [1,2,3,4] array_intersect(array(1,2,3), array(2,3,4)) AS intersect_arr, -- [2,3] array_except(array(1,2,3), array(2,3,4)) AS except_arr; -- [1]slice(arr, start_index, length): 返回数组的一个子切片。start_index从1开始注意这里和元素访问索引从0开始不同是个易错点。SELECT slice(array(a,b,c,d,e), 2, 3) AS sub; -- 从第2个元素开始取3个。结果: [b,c,d]reverse(arr): 反转数组。SELECT reverse(array(1,2,3,4)) AS reversed; -- 结果: [4,3,2,1]3.3 排序与去重函数sort_array(arr)已介绍。对于去重Hive没有直接的数组去重函数但可以通过collect_set()在聚合时实现或者通过explode再collect_set的方式对单行数组去重-- 方法展开 - 去重收集 - 返回数组 SELECT user_id, collect_set(exploded_interest) AS distinct_interests FROM user_interests LATERAL VIEW explode(interests) t AS exploded_interest GROUP BY user_id; -- 注意这会改变原数组顺序且如果原数组元素有重复会被去重。3.4 高级函数posexplode与transformposexplode(arr): 这是explode的增强版在展开数组的同时返回元素及其在数组中的位置索引。返回两列pos索引BIGINT类型和val值。SELECT user_id, pos, interest FROM user_interests LATERAL VIEW posexplode(interests) exploded_table AS pos, interest;结果user_idposinterest10010reading10011music10012hiking10020gaming10021music这在需要保留元素顺序信息的场景下非常有用比如计算用户兴趣的权重假设靠前的兴趣权重更高。transform(arr, func): 这是一个高阶函数允许你对数组中的每个元素应用一个自定义的函数func并返回由结果组成的新数组。func可以是内置函数也可以是注册的UDF。-- 将字符串数组中的每个元素转为大写 SELECT transform(array(hello, world), x - upper(x)) AS uppercased; -- Hive 2.1.0 支持lambda -- 或者使用UDF SELECT transform(email_list, e - mask_email(e)) AS masked_emails; -- 假设mask_email是自定义的脱敏UDFtransform功能强大它能将过程式的元素处理逻辑以声明式的SQL方式表达是处理复杂数组转换的利器。4. 性能深水区数组操作的陷阱与优化策略数组操作虽然灵活但在大数据量下极易成为性能瓶颈。本章节将结合我的实战经验剖析常见陷阱并提供优化思路。4.1 警惕array_contains与explode的性能诅咒陷阱1array_contains导致的全表扫描正如开篇案例所示在WHERE子句中使用array_contains过滤数据优化器往往难以使用分区裁剪或分桶过滤。因为函数内部逻辑需要在运行时对每一行的数组字段进行计算判断。当表数据量巨大时这种操作成本极高。优化策略提前展开过滤如果业务允许考虑在数据ETL层就将数组字段展开为多行明细数据。这样过滤条件就可以基于简单的标量字段如interest music进行优化器可以利用索引如果建有索引、分区或统计信息进行优化。使用布隆过滤器Bloom Filter进行预过滤对于某些可以估算的过滤条件可以在Map阶段使用布隆过滤器进行粗略过滤减少Shuffle数据量。但这需要一定的开发复杂度。审视数据模型频繁用于过滤的数组字段是否应该被设计成维度表或者用MAPSTRING, BOOLEAN类型键值对来表示标签是否存在查询效率可能会更高WHERE tags[‘music’] true。陷阱2explode导致的数据膨胀与倾斜explode会将一行数据变成多行如果某个数组特别大例如包含成千上万个元素就会产生严重的数据倾斜。处理这一行数据的Reducer或Task将承受巨大压力成为整个作业的短板。优化策略过滤后再展开在LATERAL VIEW之前尽可能使用WHERE条件过滤掉不需要的行或者使用子查询先筛选出数组长度适中的记录。-- 不佳先展开所有再过滤 SELECT * FROM huge_table LATERAL VIEW explode(large_array) t AS elem WHERE elem target; -- 较优先过滤数组长度过大或不需要的行再展开如果条件允许 SELECT * FROM huge_table WHERE size(large_array) 1000 LATERAL VIEW explode(large_array) t AS elem WHERE elem target;控制数组大小在数据生产端如日志采集、业务入库就应避免生成过大的数组。如果不可避免可以考虑在ETL过程中将其拆分成多个批次或使用其他数据结构。处理倾斜的GROUP BY在explode之后进行GROUP BY操作如果键值分布不均也会导致倾斜。可以尝试使用Hive的倾斜优化参数如set hive.groupby.skewindatatrue;或者采用两阶段聚合局部聚合全局聚合的方式。4.2 复杂嵌套结构的处理与优化Hive支持ARRAYSTRUCT...或ARRAYARRAY...这样的复杂嵌套类型。处理这类数据时explode和transform可能需要多层嵌套可读性和性能都会下降。示例处理事件数组假设有用户事件日志表每行包含一个用户的一次会话会话内有多个事件每个事件有事件名和时间戳。CREATE TABLE user_sessions ( user_id BIGINT, session_id STRING, events ARRAYSTRUCTevent_name:STRING, event_time:TIMESTAMP );查询每个用户的第一个事件和最后一个事件SELECT user_id, session_id, events[0].event_name AS first_event, -- 访问结构体字段 events[size(events)-1].event_time AS last_event_time FROM user_sessions WHERE size(events) 0;优化思考对于深度嵌套且需要频繁查询内部字段的场景考虑在数据接入层如使用Flink、Spark Streaming或ETL层将其扁平化写入明细事件表。虽然增加了存储但换来了极佳的查询灵活性。如果必须保留嵌套结构且需要基于内部字段进行过滤或聚合Hive的性能通常不如Spark SQL或Flink SQL这类对复杂类型支持更好的引擎。可以考虑使用这些引擎进行预处理。4.3 内存与UDF的注意事项在自定义UDFUser-Defined Function中处理数组时如果数组很大直接将其作为List对象读入内存可能会引发Executor内存溢出OOM。安全做法在UDF中优先考虑使用Hive提供的ObjectInspector来惰性访问数组元素而不是一次性全部转换为Java集合。如果逻辑允许尝试在UDF内部进行流式处理或分块处理。增加处理节点的内存配置mapreduce.map.memory.mb,mapreduce.reduce.memory.mb。5. 实战演练一个完整的用户标签画像分析案例让我们通过一个综合案例将前面所学的知识串联起来。假设我们有一个电商平台的用户行为日志经过初步清洗后得到一张轻度聚合的表user_behavior_agg字段名类型说明user_idBIGINT用户IDdateSTRING日期viewed_productsARRAY当日浏览的商品ID列表purchased_productsARRAY当日购买的商品ID列表search_keywordsARRAY当日搜索关键词列表业务目标分析过去7天用户的兴趣偏好为每个用户打上“高潜品类”标签。规则是如果某个商品类目需要关联商品维度表被用户浏览超过3次且至少购买1次则该类目成为用户的高潜品类。步骤1展开浏览和购买数据关联商品维度表获取类目我们首先需要将数组展开关联商品表得到类目信息并统计次数。WITH user_view_expanded AS ( -- 展开浏览记录并关联类目 SELECT u.user_id, p.category_id, COUNT(*) AS view_count FROM user_behavior_agg u LATERAL VIEW explode(u.viewed_products) v AS product_id JOIN product_dim p ON v.product_id p.product_id WHERE u.date date_sub(CURRENT_DATE, 7) -- 近7天数据 GROUP BY u.user_id, p.category_id ), user_purchase_expanded AS ( -- 展开购买记录并关联类目 SELECT u.user_id, p.category_id, COUNT(*) AS purchase_count FROM user_behavior_agg u LATERAL VIEW explode(u.purchased_products) v AS product_id JOIN product_dim p ON v.product_id p.product_id WHERE u.date date_sub(CURRENT_DATE, 7) GROUP BY u.user_id, p.category_id )步骤2根据规则筛选高潜品类将浏览和购买统计按用户和类目进行关联应用业务规则。, user_high_potential_category AS ( SELECT v.user_id, v.category_id, v.view_count, COALESCE(p.purchase_count, 0) AS purchase_count FROM user_view_expanded v LEFT JOIN user_purchase_expanded p ON v.user_id p.user_id AND v.category_id p.category_id WHERE v.view_count 3 AND COALESCE(p.purchase_count, 0) 1 )步骤3将高潜品类聚合回每个用户的数组标签最后我们将筛选出的高潜品类为每个用户聚合生成一个标签数组。SELECT user_id, collect_set(cast(category_id as STRING)) AS high_potential_categories -- 去重转为字符串方便存储 FROM user_high_potential_category GROUP BY user_id;案例总结与优化点分步CTE使用公共表表达式CTE将复杂查询分解为逻辑清晰的步骤提高了可读性和可维护性。爆炸连接在LATERAL VIEW explode之后立即进行JOIN是处理数组关联维表的标准模式。提前过滤在CTE的第一步就通过WHERE子句限制了时间范围减少了后续处理的数据量。结果聚合使用collect_set将结果重新聚合为数组形成了从“数组→明细→聚合→新数组”的完整处理闭环。潜在性能考虑如果viewed_products数组普遍很大explode可能导致严重的数据膨胀。在实际生产环境中可能需要先对user_behavior_agg表进行采样或过滤或者考虑使用transform和filter等高阶函数在数组内先进行初步筛选如果Hive版本支持再展开以减轻Shuffle压力。数组在Hive中是一把双刃剑它提供了处理复杂数据模型的强大能力但也对开发者的功底提出了更高要求。理解其底层原理谨慎选择使用场景并时刻关注性能影响才能让这把利器在数据仓库中发挥最大价值而不是成为系统瓶颈。从我个人的经验来看对于需要频繁用于过滤、连接或聚合的字段尽量保持其扁平化而对于那些主要用于一次性分析、记录历史快照或属性集合的字段数组则是非常合适的选择。

相关新闻

算法实战:从“完美偶数”问题解析大数奇偶性判定与动态规划

算法实战:从“完美偶数”问题解析大数奇偶性判定与动态规划

1. 项目概述:从一道编程题看“完美”的定义最近在整理一些经典的编程题目时,又看到了“1397 - 完美的偶数?”这个标题。乍一看,这像是一个简单的数学判断题,但真正深入进去,你会发现它远不止于此。它实际上…

2026/10/16 10:40:19 阅读更多 →
Vue3拖拽缩放组件:从核心原理到工程实践

Vue3拖拽缩放组件:从核心原理到工程实践

1. 项目概述:从“能拖拽缩放”到“优雅的交互设计”在Vue3生态里做前端开发,尤其是涉及到后台管理系统、可视化搭建平台或者任何需要灵活布局的界面时,“拖拽”和“缩放”这两个功能点几乎是绕不开的。你可能用过一些现成的库,感觉…

2026/10/16 7:23:51 阅读更多 →
SDR硬件方案全解析:从射频前端到FPGA的工程实践指南

SDR硬件方案全解析:从射频前端到FPGA的工程实践指南

1. 从零开始:SDR硬件方案的灵魂与骨架如果你对无线电感兴趣,或者正在嵌入式、通信领域摸索,那么“SDR硬件方案”这个词组对你来说,可能既熟悉又模糊。熟悉的是,它听起来很酷,是软件定义无线电的硬件基石&am…

2026/10/16 11:15:17 阅读更多 →

最新新闻

GLA与KDA对比:门控线性注意力与Delta规则的长文本建模实战

GLA与KDA对比:门控线性注意力与Delta规则的长文本建模实战

聊到长文本建模,GLA(Gated Linear Attention,门控线性注意力)和KDA(KimiDeltaAttention,一类基于Delta规则的线性注意力变体)是我最近被问得最多的两个名字。如果你一直在用标准Softmax注意力&a…

2026/10/17 8:48:26 阅读更多 →
3GPP TR 38.901:5G毫米波信道建模核心标准解析

3GPP TR 38.901:5G毫米波信道建模核心标准解析

简介:本资源为3GPP官方技术报告TR 38.901第14版(v14.3.0,2017年12月发布)的完整中文可读文档,面向5G无线通信系统研发工程师、信道建模研究人员及高校通信专业高年级学生。该报告系统定义了0.5–100 GHz频段&#xff0…

2026/10/17 8:48:26 阅读更多 →
工程BOM、制造BOM、采购BOM:三套BOM的差异与协同落地方法

工程BOM、制造BOM、采购BOM:三套BOM的差异与协同落地方法

前阵子处理完一批呆滞料,我翻来覆去核对三个系统里的三张BOM,发现同一款产品的物料数量差了一大截。设计部说图纸上就是一套电源模块加一套传动模块;工艺部说车间里必须把电源模块拆成控制板、线束和充电接口;采购部拿着外购件清单…

2026/10/17 8:48:25 阅读更多 →
Qt实时波形绘制:QCustomPlot高性能实践与数据管道设计

Qt实时波形绘制:QCustomPlot高性能实践与数据管道设计

简介:本资源是一套基于Qt5与QCustomPlot开发的轻量级实时波形绘制控件,专为Qt初学者及嵌入式上位机开发人员设计,有效降低实时曲线显示界面的实现门槛。资源包共15个文件,含4个核心cpp源码、3个头文件(含qcustomplot.h…

2026/10/17 8:48:25 阅读更多 →
Maven连不上Nexus?Connection refused/超时排查手册

Maven连不上Nexus?Connection refused/超时排查手册

做Java开发的人,几乎都被Maven连不上仓库的问题折腾过。尤其当私服用的是Nexus时,报错里出现“Connection refused”或者“Connect timeout”,第一反应往往是“我去,服务挂了”,但排查下来经常发现Nexus本身活得好好的…

2026/10/17 8:48:25 阅读更多 →
自监督学习全解析:核心原理、三大技术路线与实战避坑

自监督学习全解析:核心原理、三大技术路线与实战避坑

这几年如果你在关注人工智能,很难绕开一个词:自监督学习。BERT的掩码预测、GPT的下一词预测、SimCLR的对比损失、MAE的随机遮块重建……名字各不相同,底层逻辑却高度一致:让模型从原始数据里自己构造问题、自己寻找答案&#xff0…

2026/10/17 8:47:25 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →