Hive常用函数详解:从数据清洗到报表开发的高频实战指南

刚接触Hive那段时间,我最大的困扰不是SQL写不出来,而是每次都要去翻阅官方文档或者网上零散的帖子,才能凑齐“Hive常用函数”的完整清单。后来在某个数据平台项目里连续做了几周的数据清洗和报表开发,我才发现,真正高频使用的函数其实就那么多,关键不在于背函数名,而在于理解每个函数在什么场景下用、函数组合起来怎么写、哪些隐性问题会悄悄吃掉你的正确性。这篇笔记就是基于我那段经历整理出来的,包含Hive常用函数的分类、核心用法、实战示例,以及我踩过几次坑之后总结出的注意事项,希望能帮你少走一些弯路。

1. 函数清单背后的分类逻辑

1.1 为什么Hive函数值得单独整理

很多从MySQL或Oracle转过来的同学,上手Hive时第一反应是“语法差不多嘛”。确实,基础SQL的骨架是一致的,但Hive底层跑的是MapReduce或者Spark任务,函数的执行逻辑、数据分布方式、NULL处理策略都和传统关系型数据库有明显差异。举个最简单的例子:MySQL里count(*)和count(1)几乎没有区别,但Hive里如果配合窗口函数或者大表聚合处理不当,性能会差出好几倍。

我建议把Hive函数按“使用频率+业务场景”来记忆,而不是按官方文档的字母序。我自己的整理维度是五类:字符串处理、日期时间、聚合与窗口、条件判断与类型转换、复杂结构解析。这样的好处是,当你拿到一个需求时,能快速定位到对应的函数组合,而不是翻遍几百个函数名找半天。

1.2 查看函数用法与验证结果

写Hive函数时,我习惯先在本地或者临时表上做小样本验证。Hive提供了一个很好用的命令:

-- 查看某个函数的基本说明 SHOW FUNCTIONS LIKE 'c%'; -- 查看某个函数的具体用法 DESCRIBE FUNCTION concat_ws; DESCRIBE FUNCTION EXTENDED get_json_object;

DESCRIBE FUNCTION EXTENDED会给出比较详细的说明和示例,这个命令在你不确定参数顺序时特别有用。不要凭记忆硬写,多敲一次这个命令,比写完再等MR任务跑挂要高效得多。

2. 字符串与正则处理:数据清洗的日常主力

2.1 高频字符串函数的使用要点

字符串函数是清洗数据时用得最多的一类,以下这几个函数几乎天天见。

concat与concat_ws是我首先要说的。concat的坑在于:只要有一个参数为NULL,整个返回结果就是NULL。比如某张用户表里,姓氏字段和名字字段拼接成全名,一旦姓氏为空,结果就变成空字符串。而concat_ws处理NULL的方式就友好一些,它会跳过NULL值,只把非NULL的部分用分隔符连接起来。

-- concat 有一个NULL就会整体为NULL SELECT concat('zhang', NULL); -- NULL -- concat_ws 会跳过NULL SELECT concat_ws('-', 'zhang', NULL, 'san'); -- zhang-san

substr与split是另一对高频函数。substr('2025-01-15', 1, 4)能取出年份部分,但它对中文和特殊字符的处理是按字符位置来的,这点要注意。split返回的是数组,配合explode可以做行转列操作,这个我后面会详细说。

regexp_replace是清洗数据时的王牌函数,比如把文本里的手机号中间四位打码,或者去掉JSON字符串里的转义双引号。需要注意Hive正则使用的是Java正则语法,反斜杠需要双写。比如要把所有数字替换为星号,你得写成regexp_replace(col, '\\d', '*'),写成单反斜杠在Hive里会被解析成普通字符d,完全不是你要的效果。

表:常用字符串函数对照

函数作用注意点
concat拼接多个字符串任一参数为NULL则结果为NULL
concat_ws用分隔符拼接自动跳过NULL值
substr截取字符串索引从1开始
split按分隔符切分为数组返回array类型
regexp_replace正则替换反斜杠需双写
lower/upper/trim大小写与去空格性能开销较低,可批量使用

2.2 JSON字段提取的两种姿势

日志类数据大量使用JSON格式。Hive里我常用的提取方式是get_json_object。比如一个埋点日志字段里存着{"app":"shop","action":"pay","amount":99.0},想取其中amount的值:

SELECT get_json_object('{"app":"shop","action":"pay","amount":99.0}', '$.amount');

这里有一个切身体会:get_json_object对JSON的格式要求很严格,如果原始字符串里多了个空格或者换行,可能取不出来。我遇到过一键导出的日志里JSON字符串被截断或者多了一对引号,函数直接返回NULL但整个任务不报错,排查起来特别费劲。所以验证JSON提取逻辑时,一定要先查看原始字段的完整内容,别光看解析结果。

如果一个字段里嵌套多个JSON对象,需要提取多个键值时,可以连续调用多个get_json_object,但这样SQL会变得很长。更好的做法是配合lateral view和split拆成多行后再提取,这个在第六节展开。

2.3 字符串组合的实战套路

实际项目中,我经常用concat_ws配合collect_set或collect_list来构造“用户标签聚合串”。比如要统计每个用户购买过的商品类目列表,简单方法是:

SELECT user_id, concat_ws(',', collect_list(category)) FROM order_detail GROUP BY user_id;

这种写法适合把明细字段汇总成一个字符串供下游使用。但是要注意,collect_list不会去重,且结果的顺序不稳定,如果下游业务需要去重或排序,得用collect_set或者在子查询里排好序再聚合。曾经有个报表任务,用collect_list拼接标签后给前端展示,某天数据量变大后顺序全乱了,最后排查到原因是并发执行时reduce端输出的group顺序变化导致,后来改成collect_set并加了排序逻辑才稳定下来。

3. 日期时间函数:时区和格式的坑比想象多

3.1 时间戳与格式化

日期函数是报表开发的重灾区。Hive里最常见的一套组合是unix_timestamp、from_unixtime和date_format。

unix_timestamp()无参数时返回当前时间戳(秒级),这类似于MySQL的now()。from_unixtime(1610000000, 'yyyy-MM-dd HH:mm:ss')能把时间戳转成指定格式的字符串。反过来,unix_timestamp('2025-01-01', 'yyyy-MM-dd')能得到对应时间戳。

这里最容易被坑的是时间格式字符串。Hive里月份是MM,分钟是mi或者mm取决于上下文。我以前写过一个统计任务,把分钟误写成MM,结果跑出来的分秒数据全是1月份,这类错误不会报错,只会让数据错得莫名其妙。建议在涉及日期格式时,先在SELECT里单独试一下转换结果,确认无误再放进整个任务。

3.2 日期加减与两个日期之间的差值

日期的加减运算在轮转报表里几乎是标配。常用函数包括date_add、date_sub和datediff。

-- 返回指定日期后N天的日期 SELECT date_add('2025-01-01', 7); -- 2025-01-08 -- 返回两个日期之间的天数差 SELECT datediff('2025-01-15', '2025-01-01'); -- 14

需要特别注意的是,datediff的两个参数都是“日期”而不是“时间”,如果传了带时分秒的字符串,Hive会自动帮忙截断,但有时候会因为格式不符合“yyyy-MM-dd”而返回NULL。我一般会先to_date包一层,比如datediff(to_date(end_time), to_date(start_time)),把格式规整后再计算。

months_between用于计算两个日期之间的月份差,它在计算贷款期数或者用户年龄时很常用。这个函数的返回值是带小数的,比如months_between('2025-03-15', '2025-01-10')大约等于2.16,需要取整的话可以用cast或者floor处理一下。

3.3 时区与常见默认值

Hive里时间和时区最容易被忽略。集群默认时区一般来说是UTC,如果业务库是东八区,直接unix_timestamp()再转格式,时间会比实际少8小时。

我在某次给业务方跑次日留存时,发现凌晨0点到8点的用户行为数据全部算到了前一天。排查后确认,HiveServer2所在时区与业务时区不一致,需要在会话设置里调整:

SET timezone = 'Asia/Shanghai';

设置之后,from_unixtime和unix_timestamp的行为才会和你预期一致。这个坑属于典型的“不报错但结果错”,建议在写跨时区报表之前,先把执行会话的时区显式设置好。

4. 聚合函数与窗口函数:报表计算的灵魂

4.1 COUNT系列:你真的理解NULL的处理吗

count可能是Hive里用得最多的聚合函数,但很多人没有仔细想过count(*)、count(1)和count(col)的区别。

count(*)统计的是所有行数,不会忽略NULL。count(1)本质上是统计“行数”,效果和count(*)一样。count(col)则只会统计该列非NULL的值的个数。所以如果你想统计“有多少用户填写了手机号”,应该用count(phone),而不是count(*)再减掉什么。

-- user_phone列有3行NULL,共有10行 SELECT count(*) FROM tmp; -- 10 SELECT count(phone) FROM tmp; -- 7

另一个容易被忽略的是count(DISTINCT col)的性能问题。在小表上没问题,一旦表过亿,count(DISTINCT col)往往会产生数据倾斜,因为所有不同的值都会被拉到一个reduce里处理。我的经验是:如果对精确去重要求高,先GROUP BY col,再在外层COUNT(1);如果业务允许近似值,直接使用更高效的近似函数。后者的优化效果在超大规模场景下非常明显,能在分钟级任务上省下大量时间。

4.2 聚合函数与collect系列的组合

sum、avg、max、min不需要多说,使用场景和MySQL类似。我要重点提的是collect_list和collect_set。

collect_set天然去重,常用于“某个用户出现过哪些渠道”之类的场景。collect_list则会保留所有元素,正常情况下去重会失效,必须使用collect_set。我在标签系统里经常这样组合:

SELECT user_id, collect_set(poi_id) AS poi_list FROM user_behavior_log WHERE dt = '2025-01-15' GROUP BY user_id;

聚合后的数组如果还想展开成多行,可以配合explode使用,后面会讲到。

4.3 窗口函数:排名、同比环比一次说清

窗口函数是Hive里和MySQL 8.0、SparkSQL共通的强大工具。最常用的几个包括row_number、rank、dense_rank、lag和lead。

排名三兄弟的区别是:

函数输出结果(并列情况)说明
row_number()1, 2, 3, 4不并列,序号连续
rank()1, 2, 2, 4并列跳号
dense_rank()1, 2, 2, 3并列不跳号

我在“每用户最近一次购买记录”这种取TOP N任务里,最常用的写法如下:

SELECT user_id, order_id, order_time FROM ( SELECT user_id, order_id, order_time, row_number() OVER (PARTITION BY user_id ORDER BY order_time DESC) AS rn FROM order_info WHERE dt = '2025-01-15' ) t WHERE rn = 1;

窗口函数里PARTITION BY后面的列会决定分组的范围。ORDER BY后如果不写ASC/DESC,默认是升序,这一点经常被人忽略,导致排序结果和预期相反。

lag与lead用来取同组内前后N行的值,在计算连续指标、环比变化时极其顺手。比如想算每个用户相邻两次下单时间间隔:

SELECT user_id, order_time, lag(order_time, 1) OVER (PARTITION BY user_id ORDER BY order_time) AS prev_order_time FROM order_info;

这类逻辑如果不用窗口函数,就得靠自关联,写起来长且容易错。反过来说,lag的默认值可以设置,比如lag(order_time, 1, '1970-01-01')表示没有前一行时填充默认值,这个技巧可以避免后期还要处理一堆NULL。

4.4 窗口函数与聚合函数的执行顺序

很多新手会混淆窗口函数和GROUP BY一起使用时的作用顺序。简单说:WHERE是最先执行的,然后是GROUP BY与聚合计算,接着是窗口函数,最后才是外层查询过滤。窗口函数是在聚合结果的基础上再做计算的。

所以如果你写:

SELECT user_id, total_amount, SUM(total_amount) OVER (PARTITION BY user_id) AS user_total FROM ( SELECT user_id, SUM(amount) AS total_amount FROM order_detail GROUP BY user_id ) t;

这里内层已经按用户聚合了,外面的窗口函数再按用户重复加总,逻辑没有问题。但如果想按“全部用户”做整体汇总,PARTITION BY ()会比PARTITION BY user_id更能表达意图。这类嵌套执行语义最容易在多层子查询里搞混,我建议每写一层就拆开验证一下结果。

5. 条件判断、类型转换与复杂结构解析

5.1 IF、CASE WHEN和COALESCE怎么选

条件判断几乎是每个SQL里都有的逻辑。Hive里常用IF(condition, true_value, false_value)和CASE WHEN。

当条件比较少时,我倾向用IF,写法简洁。但一旦条件超过两个,CASE WHEN可读性更好。比如价格分层:

SELECT order_id, CASE WHEN amount > 1000 THEN '高客单' WHEN amount > 100 AND amount <= 1000 THEN '中客单' ELSE '低客单' END AS price_level FROM order_info;

COALESCE(col, default_value)则专门用来处理NULL。它和MySQL的IFNULL类似,但可以传入多个参数,依次返回第一个非NULL的值。比如有三个手机号字段,业务上想取第一个非空的:

SELECT COALESCE(phone1, phone2, phone3, 'UNKNOWN') AS valid_phone FROM user_info;

需要注意,COALESCE返回的默认值类型要和字段类型保持一致,否则可能会触发隐式转换,造成额外开销或结果异常。我在某次处理中,因为默认值用了0而字段是string,结果返回的“0”也被当成字符串参与后续运算,最终拼出了一个错误的主键。

5.2 CAST和隐式类型转换的坑

CAST(expr AS type)是Hive的主要类型转换手段。比如CAST('123.4' AS DOUBLE)可以得到123.4,CAST(price AS DECIMAL(10,2))可以控制小数位。

但是CAST失败时返回NULL而非抛错,这个行为在数据质量检查时很要命。假设某字段大部分是数字,偶有几个字母,你直接转DOUBLE后计算平均值,NULL不会报错,结果被悄无声息地算小了。处理这类脏数据的正确姿势是,先用正则过滤掉明显不符合格式的内容,再转换:

SELECT CASE WHEN phone REGEXP '^[0-9]{11}$' THEN phone END AS valid_phone FROM user_info;

另外,Hive很多函数会自动做隐式类型转换。比如unix_timestamp传入字符串时,如果格式不完全匹配,有时会隐式取默认格式,有时返回NULL,行为有细微差别。我给出的建议是:凡是涉及日期和时间戳,一律显式带上格式参数;凡是涉及金额,一律显式CAST。不要依赖隐式转换,省掉的几行代码可能换来几天的排查时间。

5.3 explode与lateral view处理复杂结构

Hive里的数组、Map结构非常常见,比如一个用户有多个标签、一个订单有多个商品明细。explode函数可以把一个数组或Map展开为多行。单用explode时,原表其他列会重复出现,为了配合原表的其他字段,必须用lateral view。

一个经典的场景是:

SELECT user_id, tag FROM user_profile LATERAL VIEW explode(tags) t AS tag;

这里tags是array类型,展开后每一行一个tag,同时保留user_id。

如果是按逗号分隔的字符串,需要先用split转成数组,再配合lateral view:

SELECT user_id, event FROM event_log LATERAL VIEW explode(split(event_list, ',')) t AS event;

这个写法在解析埋点数据时高频出现。还有一点提醒:lateral view展开时,如果数组为NULL或空,这行数据会丢失。如果你希望保留原行,可以使用lateral view outer,效果类似LEFT JOIN:

SELECT user_id, tag FROM user_profile LATERAL VIEW OUTER explode(if(size(tags) = 0, array(NULL), tags)) t AS tag;

explode本身不能处理Map类型展开成两列的情况,如果需要同时取Map里的key和value,可以用explode(map_col),它会默认展开成key和value两列。

5.4 容易被忽略但很好用的其他函数

在Hive常用函数中,还有一些冷门但是能救命的函数,我顺手列一下。

parse_url用于解析URL。比如要从https://example.com/path?query=1中提取参数值,可以这样写:

SELECT parse_url('https://example.com/path?query=1', 'QUERY', 'query');

array_contains、sort_array、size这几个数组函数,在标签计算里也很有用。size可以查看数组长度,判断一个用户是否属于“高活跃人群”时经常用。

array_contains适合判断一个会话里是否包含某个关键行为:

SELECT user_id FROM session_table WHERE array_contains(events, 'launch_app');

sort_array则能把数组排序后输出,避免collect_list顺序不确定的问题。

条件聚合这个技巧也很实用,比如统计订单里男性用户的订单量,可以在count里直接嵌CASE WHEN:

SELECT COUNT(CASE WHEN gender = 'male' THEN 1 END) AS male_orders FROM order_detail;

COUNT(CASE WHEN ... THEN 1 END)和SUM(CASE WHEN ... THEN 1 ELSE 0 END)是等价的,但前者写起来更短,并且在多数引擎里执行效率相当。

6. 我在实际开发中沉淀的几条铁律

6.1 复杂查询先看执行计划再调函数

这个习惯救过我很多次。即便函数语法都对,Hive执行计划也能暴露关键问题,比如数据倾斜、Map端聚合失效、分区裁剪没生效。遇到慢查询,我会立刻执行:

EXPLAIN SELECT ...

看是否出现了不必要的Shuffle。如果某个聚合函数的输入列很大但分组很小,就要考虑MAPJOIN或者调整SET hive.auto.convert.join=true。很多Hive常用函数在实际任务中表现不佳,不是函数本身的问题,而是执行计划没有走对。

6.2 函数组合时保持可读性

Hive函数是可以嵌套的,比如from_unixtime(unix_timestamp(order_time, 'yyyy-MM-dd HH:mm:ss'), 'yyyy-MM-dd')可以把带时间字符串截成日期。但这种嵌套一旦超过两层,可读性就会断崖式下降。我在团队里定的规矩是:一层子查询能解决的事,不要在三层函数嵌套里硬挤。把中间结果做成子查询或者临时表,不仅SQL容易维护,出现问题时定位也快。

6.3 最后分享一个小技巧

如果你觉得某个Hive函数的行为很怪,最快验证方式不是去翻文档,而是直接构造一个一行的小表,把各种边界值都扔进去试一遍。我自己常用一个临时表,里面的数据包括NULL、空字符串、正常值、超长值、特殊符号,基本上测试一轮就能摸清函数的脾气。一个函数的边界行为,往往比正常取值更能决定你线上任务会不会出错。

Hive常用函数这门功课,知识点本身并不难,难的是把每个函数放在真实业务场景里去理解它的行为和限制。上面这些函数覆盖了我日常开发中至少九成以上的场景。你如果刚开始接触Hive,建议先把本文提到的函数在本地环境敲一遍,再对照业务需求组合使用,慢慢就会形成自己的函数清单。

相关新闻

ListView多选列表实战:CheckBox状态管理与全选联动详解

ListView多选列表实战:CheckBox状态管理与全选联动详解

1. 项目概述与场景定位1.1 这个Demo到底解决了什么问题多选列表是移动端开发里绕不开的一个硬需求。无论是文件管理器里的批量删除、购物车勾选结算、消息列表的批量已读&#xff0c;还是任务清单里批量更改状态&#xff0c;底层交互模型都指向同一套东西&#xff1a;ListView&…

2026/10/21 2:20:51 阅读更多 →
不开窗口也能背单词:ToastFish 用 Windows 通知栏背单词使用指南

不开窗口也能背单词:ToastFish 用 Windows 通知栏背单词使用指南

不开窗口也能背单词&#xff1a;ToastFish 用 Windows 通知栏背单词使用指南 【免费下载链接】ToastFish 一个利用摸鱼时间背单词的软件。 项目地址: https://gitcode.com/GitHub_Trending/to/ToastFish 开会、上课、领导在场&#xff0c;背单词软件开着却没人敢点开。这…

2026/10/21 2:19:51 阅读更多 →
SatDump 卫星信号解码实战:15分钟出第一张气象云图

SatDump 卫星信号解码实战:15分钟出第一张气象云图

SatDump 卫星信号解码实战&#xff1a;15分钟出第一张气象云图 【免费下载链接】SatDump A generic satellite data processing software. 项目地址: https://gitcode.com/GitHub_Trending/sa/SatDump USB 线插上 RTL-SDR&#xff0c;天线怼到窗边&#xff0c;对着 137 …

2026/10/21 2:19:50 阅读更多 →

最新新闻

RAG效果差?问题多半出在知识库管理:清洗、分块与治理实战

RAG效果差?问题多半出在知识库管理:清洗、分块与治理实战

先说明一点&#xff1a;这个标题我深有同感。做了大半年RAG相关的东西&#xff0c;见过不少团队把精力全压在召回链路调参上&#xff0c;结果效果上不去&#xff0c;最后排查一圈&#xff0c;问题全出在知识库本身——脏数据、错分块、无版本、无评测&#xff0c;源头一乱&…

2026/10/21 3:06:07 阅读更多 →
基于MATLAB深度学习与LSTM的污水处理异常工况识别实践

基于MATLAB深度学习与LSTM的污水处理异常工况识别实践

简介&#xff1a;面向污水处理异常工况识别的MATLAB深度学习资料包&#xff0c;覆盖数据集、迁移学习网络结构、训练脚本到结果可视化全流程&#xff0c;适合环境工程与人工智能交叉领域的研究者、研究生及工程师&#xff0c;可用于异常工况建模、模型迁移与效果评估。包内共20…

2026/10/21 3:06:07 阅读更多 →
MiniMax 2.5 Function Calling 格式解析与 AI 编程工具落地实践

MiniMax 2.5 Function Calling 格式解析与 AI 编程工具落地实践

做IkunCoder这段时间&#xff0c;我最大的感受是&#xff1a;一个AI编程工具能不能真正“动手干活”&#xff0c;关键不在模型聊天多好&#xff0c;而在对function calling格式吃得透不透。最近一直在跟进MiniMax 2.5的function calling方案&#xff0c;研究它如何把“用户一句…

2026/10/21 3:06:06 阅读更多 →
火箭飞行仿真中推力曲线处理模块的设计与实践

火箭飞行仿真中推力曲线处理模块的设计与实践

1. 推力曲线为什么是仿真里最"磨人"的一块做火箭飞行仿真做过一段时间的朋友&#xff0c;应该都有一个共同感受&#xff1a;飞行力学方程、气动模型、控制律这些东西&#xff0c;理论上都有成熟套路可循&#xff0c;真正让人反复返工、调试到深夜的&#xff0c;往往是…

2026/10/21 3:06:06 阅读更多 →
Python+CNN卷积神经网络实战:土豆病害识别项目全流程解析

Python+CNN卷积神经网络实战:土豆病害识别项目全流程解析

1. 项目到底在做什么&#xff1a;别被“毕设”两个字吓住先说结论&#xff1a;基于 Python 和 CNN 卷积神经网络做土豆病害识别&#xff0c;本质上就是一个图像分类任务&#xff0c;核心目标是让程序拿到一张土豆叶子的照片&#xff0c;自动判断它属于哪种病害&#xff0c;比如…

2026/10/21 3:06:06 阅读更多 →
Nginx为何要用StatefulSet?稳定身份与持久化存储实战解析

Nginx为何要用StatefulSet?稳定身份与持久化存储实战解析

1. Nginx为什么会落到StatefulSet头上——先弄清楚值不值得先说个直觉判断&#xff1a;一听到“Nginx用StatefulSet部署”&#xff0c;大多数人第一反应是“写错了吧”。Nginx这种典型无状态的反向代理&#xff0c;常规做法就是Deployment挂ConfigMap&#xff0c;前面再套个Ser…

2026/10/21 3:05:06 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →