十二、Hive 函数

作者:IvanCodes
日期:2025年5月1日
专栏:Hive教程

数据处理广阔天地中,我们常常需要对数据进行转换、计算、清洗提取特定信息。Hive 提供了强大内置运算符丰富的内置函数库,它们就像魔法师手中的魔法棒,能帮助我们灵活高效操控数据挖掘深层价值

思维导图

在这里插入图片描述
在这里插入图片描述

一、Hive 内置运算符概览

深入函数之前,我们先快速回顾一下 Hive 支持的常见内置运算符,这些是构成表达式基本组件

  1. 算术运算符+, -, *, /, %, DIV
  2. 关系运算符=, <>, !=, <, >, <=, >=, IS NULL, IS NOT NULL, BETWEEN, IN, NOT IN, LIKE, RLIKE, REGEXP
  3. 逻辑运算符AND ( && ), OR ( || ), NOT ( ! )
  4. 位运算符&, |, ^, ~
  5. 复杂类型构造器MAP(), STRUCT(), ARRAY(), NAMED_STRUCT()
  6. 复杂类型访问运算符A[key], A.col

二、Hive 内置函数详解

我们可以通过 SHOW FUNCTIONS; 查看所有可用函数,DESC FUNCTION [EXTENDED] <function_name>; 查看特定函数详情。

1. 数值函数 (Mathematical Functions)

  • round(DOUBLE a): 四舍五入为BIGINT。
SELECT round(3.14159); -- 输出: 3
  • round(DOUBLE a, INT d): 四舍五入到小数点后d位。
SELECT round(3.14159, 2); -- 输出: 3.14
  • floor(DOUBLE a): 不大于a的最大整数。
SELECT floor(3.7); -- 输出: 3
  • ceil(DOUBLE a)ceiling(DOUBLE a): 不小于a的最小整数。
SELECT ceil(3.1); -- 输出: 4
  • abs(DOUBLE a): 绝对值。
SELECT abs(-5.5); -- 输出: 5.5
  • pow(DOUBLE a, DOUBLE p)power(DOUBLE a, DOUBLE p): a的p次方。
SELECT pow(2, 3); -- 输出: 8.0
  • sqrt(DOUBLE a): 平方根。
SELECT sqrt(16); -- 输出: 4.0
  • rand()rand(INT seed): 0到1之间的随机数。
SELECT rand(); -- 输出: (一个随机小数)
  • bin(BIGINT a): 二进制字符串。
SELECT bin(10); -- 输出: 1010
  • hex(BIGINT a)hex(STRING a): 十六进制字符串。
SELECT hex(255); -- 输出: FF
  • conv(BIGINT num, INT from_base, INT to_base): 进制转换。
SELECT conv('A', 16, 10); -- 输出: 10

2. 字符串函数 (String Functions)

  • length(STRING a): 字符串长度。
SELECT length('hello'); -- 输出: 5
  • concat(STRING|BINARY a, STRING|BINARY b...): 连接字符串。
SELECT concat('Hi, ', 'Hive'); -- 输出: Hi, Hive
  • concat_ws(STRING separator, STRING a, STRING b...): 带分隔符连接。
SELECT concat_ws('-', 'A', 'B', 'C'); -- 输出: A-B-C
  • lower(STRING a)lcase(STRING a): 转小写。
SELECT lower('HELLO'); -- 输出: hello
  • upper(STRING a)ucase(STRING a): 转大写。
SELECT upper('world'); -- 输出: WORLD
  • trim(STRING a): 去两端空格。
SELECT trim('  Hive  '); -- 输出: Hive
  • substring(STRING a, INT start[, INT len]): 取子串。
SELECT substring('HelloWorld', 1, 5); -- 输出: Hello
  • replace(STRING a, STRING old, STRING new): 替换子串。
SELECT replace('banana', 'na', 'PA'); -- 输出: baPAPA
  • instr(STRING str, STRING substr): 子串首次出现位置。
SELECT instr('apple-banana-orange', 'banana'); -- 输出: 7
  • split(STRING str, STRING pat): 按正则分割,返回数组。
SELECT split('a,b,c', ','); -- 输出: ["a","b","c"]
  • lpad(STRING str, INT len, STRING pad): 左填充。
SELECT lpad('hi', 5, '*'); -- 输出: ***hi
  • rpad(STRING str, INT len, STRING pad): 右填充。
SELECT rpad('hi', 5, '*'); -- 输出: hi***
  • regexp_extract(STRING subject, STRING pattern, INT index): 正则提取。
SELECT regexp_extract('user_123_name', 'user_(\\d+)_name', 1); -- 输出: 123
  • regexp_replace(STRING initial_string, STRING pattern, STRING replacement): 正则替换。
SELECT regexp_replace('100-200', '-', ':'); -- 输出: 100:200

3. 日期函数 (Date Functions)

  • current_date(): 当前日期。
SELECT current_date(); -- 输出: (类似 2023-10-27)
  • current_timestamp(): 当前日期时间。
SELECT current_timestamp(); -- 输出: (类似 2023-10-27 10:30:00.123)
  • unix_timestamp(): 当前Unix时间戳。
SELECT unix_timestamp(); -- 输出: (当前秒级时间戳)
  • unix_timestamp(STRING date[, STRING pattern]): 日期转Unix时间戳。
SELECT unix_timestamp('2023-10-27', 'yyyy-MM-dd'); -- 输出: (对应时间戳)
  • from_unixtime(BIGINT unixtime[, STRING format]): Unix时间戳转日期字符串。
SELECT from_unixtime(1698381000, 'yyyy/MM/dd HH:mm'); -- 输出: 2023/10/27 10:30
  • to_date(STRING timestamp): 提取日期部分。
SELECT to_date('2023-10-27 10:30:00'); -- 输出: 2023-10-27
  • date_format(STRING/TIMESTAMP/DATE ts, STRING fmt): 格式化日期。
SELECT date_format(current_date(), 'yyyy年MM月dd日'); -- 输出: (类似 2023年10月27日)
  • year(STRING date), month(STRING date), day(STRING date): 提取年/月/日。
SELECT year('2023-10-27'), month('2023-10-27'); -- 输出: 2023, 10
  • date_add(STRING/TIMESTAMP/DATE startdate, INT days): 日期加天数。
SELECT date_add('2023-10-27', 3); -- 输出: 2023-10-30
  • date_sub(STRING/TIMESTAMP/DATE startdate, INT days): 日期减天数。
SELECT date_sub('2023-10-27', 3); -- 输出: 2023-10-24
  • datediff(STRING enddate, STRING startdate): 日期天数差。
SELECT datediff('2023-10-30', '2023-10-27'); -- 输出: 3

4. 条件函数 (Conditional Functions)

  • if(boolean testCondition, T valueTrue, T valueFalseOrNull): IF判断。
SELECT if(1 > 0, 'Yes', 'No'); -- 输出: Yes
  • CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END: 标准CASE WHEN。
SELECT
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
ELSE 'C'
END AS grade
FROM (SELECT 85 AS score) t; -- 输出: B
  • COALESCE(T v1, T v2, ...): 返回首个非NULL值。
SELECT COALESCE(NULL, 'Default1', 'Default2'); -- 输出: Default1
  • NVL(T value, T default_value): value非NULL则返回value,否则返回default_value。
SELECT NVL(NULL, 'Is Null'); -- 输出: Is Null

5. 类型转换函数 (Type Conversion Functions)

  • cast(expr AS type): 强制类型转换。
SELECT cast('123' AS INT) + cast('7' AS INT); -- 输出: 130

6. 聚合函数 (Aggregate Functions) (常与 GROUP BY 联用)

  • count(*)count(expr)count(DISTINCT expr): 计数。
SELECT count(*) FROM my_table;
SELECT count(DISTINCT user_id) FROM user_logs;
  • sum(col)sum(DISTINCT col): 求和。
SELECT sum(sales_amount) FROM sales_data;
  • avg(col)avg(DISTINCT col): 平均值。
SELECT avg(score) FROM student_scores;
  • min(col): 最小值。
SELECT min(price) FROM products;
  • max(col): 最大值。
SELECT max(temperature) FROM weather_records;

7. 集合函数 (Collection Functions) (处理ARRAY, MAP, STRUCT)

  • size(MAP<K,V> m)size(ARRAY<T> a): 返回Map或Array的大小。
SELECT size(array(1, 2, 3)); -- 输出: 3
SELECT size(map('a', 1, 'b', 2)); -- 输出: 2
  • array_contains(ARRAY<T> a, value): 判断Array是否包含指定值。
SELECT array_contains(array('apple', 'banana'), 'apple'); -- 输出: true
  • map_keys(MAP<K,V> m): 返回Map的所有键组成的Array。
SELECT map_keys(map('name', 'Alice', 'age', 30)); -- 输出: ["name","age"] (顺序可能不同)
  • map_values(MAP<K,V> m): 返回Map的所有值组成的Array。
SELECT map_values(map('name', 'Alice', 'age', 30)); -- 输出: ["Alice","30"] (顺序可能不同)
  • sort_array(ARRAY<T> a): 对Array进行排序。
SELECT sort_array(array(3, 1, 2)); -- 输出: [1,2,3]

8. 表生成函数 (Table-Generating Functions - UDTF)

  • explode(ARRAY<T> a): 将数组每个元素转为一行。
SELECT explode(array('A', 'B')) AS item;
-- 输出:
-- A
-- B
  • explode(MAP<K,V> m): 将Map每个键值对转为一行两列。
SELECT explode(map('key1', 'val1')) AS (my_key, my_value);
-- 输出:
-- key1  val1
  • posexplode(ARRAY<T> a): 类似 explode(array),额外输出元素在数组中的位置(从0开始)。
SELECT posexplode(array('X', 'Y')) AS (pos, val);
-- 输出:
-- 0  X
-- 1  Y
  • inline(ARRAY<STRUCT<f1:T1, f2:T2, ...>> a): 将结构体数组展开,每个结构体的字段成为独立的列。
-- 假设table t有列 arr_struct: ARRAY<STRUCT<name:STRING, age:INT>>
-- 且某行 arr_struct 值为 [named_struct('name','Tom','age',20), named_struct('name','Jerry','age',18)]
-- SELECT inline(arr_struct) FROM t;
-- 输出 (对于该行会产生两行结果):
-- Tom   20
-- Jerry 18

9. 数据脱敏函数 (Data Masking/Anonymization - 通过组合或UDF实现)

Hive 内置的直接、专用的脱敏函数较少。通常通过组合现有字符串函数来实现,或者编写用户自定义函数 (UDF) 来完成复杂的脱敏逻辑。

  • 示例:部分屏蔽手机号 (组合字符串函数)
-- 假设 phone_number 是 '13812345678'
SELECT concat(substring(phone_number, 1, 3), '****', substring(phone_number, 8)) AS masked_phone
FROM (SELECT '13812345678' AS phone_number) t;
-- 输出: 138****5678
  • 示例:屏蔽邮箱用户名 (组合字符串函数)
-- 假设 email 是 'user_example@domain.com'
SELECT concat(substring(email, 1, 1), -- 第一个字符'****',                  -- 屏蔽符substring(email, locate('@', email) - 1, 1), -- @前一个字符substring(email, locate('@', email)) -- @及之后的部分
) AS masked_email
FROM (SELECT 'user_example@domain.com' AS email) t;
-- 输出: u****e@domain.com (这是一个简化示例,更复杂的正则UDF效果更好)

对于更复杂或通用的脱敏需求(如身份证号、银行卡号按规则屏蔽,或基于角色的动态脱敏),通常推荐开发 UDF

10. 用户自定义函数 (拓展)

内置函数无法满足特定的业务逻辑时,Hive 允许用户使用 Java (或其他语言,但Java最常见) 编写自己的函数。

  • UDF (User-Defined Function): 一对一或多对一函数,输入一行中的一个或多个值,输出一个值。

    • 例如,创建一个 to_uppercase(string_col) 函数,将输入字符串转为大写(虽然已有内置upper)。
    • 创建和使用步骤 (简要)
      1. 编写 Java 类继承 org.apache.hadoop.hive.ql.exec.UDF
      2. 实现 evaluate() 方法。
      3. 将 Java 项目打成 JAR 包。
      4. 在 Hive 中注册 JAR 包: ADD JAR /path/to/your.jar;
      5. 创建临时或永久函数: CREATE TEMPORARY FUNCTION my_upper AS 'com.example.MyUpperUDF';
      6. 使用函数: SELECT my_upper(name) FROM my_table;
  • UDAF (User-Defined Aggregate Function): 多对一函数,类似 SUM(), COUNT(),对分组数据进行聚合。编写 UDAF 相对复杂。

  • UDTF (User-Defined Table-Generating Function): 一对多函数,类似 explode(),输入一行,输出多行。

练习题

  1. 将字符串 “hive is great” 中的所有空格替换为下划线 _
  2. 计算日期 “2023-01-15” 之后45天的日期。
  3. 有一个用户评分表 ratings (user_id INT, score INT),如果用户评分低于60则标记为 “不及格”,否则标记为 “及格”。写出查询。
  4. 将字符串 “ID:123,Name:Alice,Age:30” 按逗号分割,然后对每个部分按冒号分割,提取出 Name 的值 “Alice”。
  5. 有一个字段 tags 其值为 ARRAY 类型,如 ['TagA', 'TagB', 'TagC']。检查该数组是否包含 ‘TagB’。
  6. 将一个包含用户月消费金额的数组 monthly_spend ARRAY<INT> (例如 [100, 150, 120]) 展开成多行,每行显示一个月的消费金额。
  7. 假设有一个字段 ip_address 存储IP地址字符串,请使用内置函数(如果可能)将其最后一个点之后的部分替换为 ‘XXX’ (例如 ‘192.168.1.100’ -> ‘192.168.1.XXX’)。如果内置函数难以实现,请描述UDF的思路。
  8. 将 Unix 时间戳 1672531200 (代表 2023-01-01 00:00:00 UTC) 格式化为 “YYYY年MM月DD日 HH时mm分ss秒” 的形式。
  9. 从字符串 “apple,banana,orange,apple” 中提取出所有不重复的水果名称,并计算不重复水果的数量。
  10. 如何使用 COALESCE 函数处理一个可能为NULL的 middle_name 字段,如果它为NULL,则在拼接全名时用空字符串代替?例如,first_name, middle_name, last_name

练习题答案

  1. 将字符串 “hive is great” 中的所有空格替换为下划线 _
SELECT replace('hive is great', ' ', '_');
  1. 计算日期 “2023-01-15” 之后45天的日期。
SELECT date_add('2023-01-15', 45);
  1. 有一个用户评分表 ratings (user_id INT, score INT),如果用户评分低于60则标记为 “不及格”,否则标记为 “及格”。写出查询。
SELECT user_id, score, if(score < 60, '不及格', '及格') AS status FROM ratings;
-- 或者使用 CASE WHEN
-- SELECT user_id, score, CASE WHEN score < 60 THEN '不及格' ELSE '及格' END AS status FROM ratings;
  1. 将字符串 “ID:123,Name:Alice,Age:30” 按逗号分割,然后对每个部分按冒号分割,提取出 Name 的值 “Alice”。
SELECT split(kv[1], ':')[1] AS name_value
FROM (SELECT split('ID:123,Name:Alice,Age:30', ',') AS kv_array
) t
LATERAL VIEW explode(kv_array) exploded_table AS kv_pair_str
WHERE split(kv_pair_str, ':')[0] = 'Name';
-- 更简洁的方式如果知道Name总在第二个位置:
SELECT split(split('ID:123,Name:Alice,Age:30', ',')[1], ':')[1];
  1. 有一个字段 tags 其值为 ARRAY 类型,如 ['TagA', 'TagB', 'TagC']。检查该数组是否包含 ‘TagB’。
SELECT array_contains(tags, 'TagB') FROM (SELECT array('TagA', 'TagB', 'TagC') AS tags) t;
  1. 将一个包含用户月消费金额的数组 monthly_spend ARRAY<INT> (例如 [100, 150, 120]) 展开成多行,每行显示一个月的消费金额。
SELECT spend
FROM (SELECT array(100, 150, 120) AS monthly_spend) t
LATERAL VIEW explode(monthly_spend) exploded_table AS spend;
  1. 假设有一个字段 ip_address 存储IP地址字符串,请使用内置函数(如果可能)将其最后一个点之后的部分替换为 ‘XXX’ (例如 ‘192.168.1.100’ -> ‘192.168.1.XXX’)。如果内置函数难以实现,请描述UDF的思路。
    使用内置函数比较复杂,需要多次使用 instrsubstringregexp_replace
SELECT regexp_replace(ip_address, '\\.[^.]+$', '.XXX') AS masked_ip
FROM (SELECT '192.168.1.100' AS ip_address) t;
-- 或者更精确控制,找到最后一个点的位置
-- SELECT concat(substring(ip_address, 1, instr(reverse(ip_address), '.') * -1 + length(ip_address) -1), '.XXX') ... (这种方式更复杂且易错)

UDF思路:编写一个Java UDF,输入IP字符串。在Java中使用 lastIndexOf('.') 找到最后一个点的位置,然后使用 substring() 截取前面的部分,并拼接上 “.XXX”。

  1. 将 Unix 时间戳 1672531200 (代表 2023-01-01 00:00:00 UTC) 格式化为 “YYYY年MM月DD日 HH时mm分ss秒” 的形式。
SELECT from_unixtime(1672531200, 'yyyy年MM月dd日 HH时mm分ss秒');
  1. 从字符串 “apple,banana,orange,apple” 中提取出所有不重复的水果名称,并计算不重复水果的数量。
SELECT collect_set(fruit) AS unique_fruits, size(collect_set(fruit)) AS unique_fruit_count
FROM (SELECT explode(split('apple,banana,orange,apple', ',')) AS fruit
) t_fruits;
  1. 如何使用 COALESCE 函数处理一个可能为NULL的 middle_name 字段,如果它为NULL,则在拼接全名时用空字符串代替?例如,first_name, middle_name, last_name
SELECT concat_ws(' ', first_name, COALESCE(middle_name, ''), last_name) AS full_name
FROM (SELECT 'John' AS first_name, NULL AS middle_name, 'Doe' AS last_nameUNION ALLSELECT 'Jane' AS first_name, 'M' AS middle_name, 'Smith' AS last_name
) t_names;
-- 对于 'John', NULL, 'Doe' 会输出 "John  Doe" (注意concat_ws对空字符串的处理)
-- 如果希望中间没有多余空格,可以这样:
-- SELECT trim(concat(first_name, ' ', COALESCE(concat(middle_name, ' '), ''), last_name)) AS full_name ...

更优雅的方式是针对 concat_ws 的特性,如果 COALESCE(middle_name, NULL) 结果是 NULL,concat_ws 会跳过它。但如果希望它是空字符串而不是被跳过(比如为了保持名字间的空格),上面的 COALESCE(middle_name, '') 是对的。

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

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

相关文章

Linux之Nginx安装及配置原理篇(一)

Nginx安装及配置 前情回顾 首先针对Nginx进程模型&#xff0c;我们回顾一下它的原理机制&#xff0c;我们知道它是通过Master通过fork分发任务节点给予work节点&#xff0c;然后work节点触发了event事件&#xff0c;之后通过一个access_muttex互斥锁&#xff0c;来单线程调用我…

嵌入式培训之数据结构学习(五)栈与队列

一、栈 &#xff08;一&#xff09;栈的基本概念 1、栈的定义&#xff1a; 注&#xff1a;线性表中的栈在堆区&#xff08;因为是malloc来的&#xff09;&#xff1b;系统中的栈区存储局部变量、函数形参、函数返回值地址。 2、栈顶和栈底&#xff1a; 允许插入和删除的一端…

深度学习---知识蒸馏(Knowledge Distillation, KD)

一、知识蒸馏的本质与起源 定义&#xff1a; 知识蒸馏是一种模型压缩与迁移技术&#xff0c;通过将复杂高性能的教师模型&#xff08;Teacher Model&#xff09;所学的“知识”迁移到轻量级的学生模型&#xff08;Student Model&#xff09;&#xff0c;使学生模型在参数量和计…

ARP Detection MAC-Address Static

一、ARP Detection&#xff08;ARP检测&#xff09; ✅ 定义&#xff1a; ARP检测是一种防止ARP欺骗攻击的安全机制。它通过监控或验证网络中的ARP报文&#xff0c;来判断是否存在伪造的ARP信息。 &#x1f50d; 工作原理&#xff1a; 网络设备&#xff08;如交换机&#xf…

基于 Python 的界面程序复现:标准干涉槽型设计计算及仿真

基于 Python 的界面程序复现&#xff1a;标准干涉槽型设计计算及仿真 在工业设计与制造领域&#xff0c;刀具的设计与优化是提高生产效率和产品质量的关键环节之一。本文将介绍如何使用 Python 复现一个用于标准干涉槽型设计计算及仿真的界面程序&#xff0c;旨在帮助工程师和…

Python绘制南丁格尔玫瑰图:从入门到实战

Python绘制南丁格尔玫瑰图&#xff1a;从入门到实战 引言 南丁格尔玫瑰图&#xff08;Nightingale Rose Chart&#xff09;&#xff0c;也被称为极区图&#xff08;Polar Area Chart&#xff09;&#xff0c;是一种独特的数据可视化方式。这种图表由弗洛伦斯南丁格尔&#xff…

计算机操作系统概要

不谋万世者&#xff0c;不⾜谋⼀时。不谋全局者 &#xff0c;足谋⼀域 。 ——陈澹然《寤⾔》《迁都建藩议》 操作系统 一.对文件简单操作的常用基础指令 ls ls 选项 目录或⽂件名:罗列当前⽬录下的⽂件 -l&#xff1a;以长格式显示⽂件和⽬录的详细信息 -a 或 --all&…

<PLC><视觉><机器人>基于海康威视视觉检测和UR机械臂,如何实现N点标定?

前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,相关设备如触摸屏(HMI)、交换机等工控产品,如果有…

从专家编码到神经网络学习:DTM 的符号操作新范式

1st author: Paul Soulos paper: Differentiable Tree Operations Promote Compositional Generalization ICML 2023 code: psoulos/dtm: Differentiable Tree Machine 1. 问题与思路 现代深度学习在连续向量空间中取得了巨大成功&#xff0c;然而在处理具有显式结构&#x…

微信小程序第三方代开发模式技术调研与实践总结

🚀 微信小程序第三方代开发模式技术调研与实践总结 📖 前言 随着企业对私有化品牌运营诉求的增加,许多大型客户希望将原本由 SaaS 平台统一提供的小程序迁移至自有主体(AppID)下运行,同时又希望继续沿用 SaaS 平台的业务服务与数据托管方式。微信开放平台提供的“小程…

开启智能未来:DeepSeek赋能行业变革之路

前言 在人工智能重构生产关系的2025年&#xff0c;DeepSeek以其革命性的推理能力和Python生态的技术延展性&#xff0c;正在重塑内容创作与数据智能的边界。本书以"工具迭代思维升维"为双轮驱动&#xff0c;构建从认知突破到商业落地的完整知识图谱。 DeepSeek的崛…

常见三维引擎坐标轴 webgl threejs cesium blender unity ue 左手坐标系、右手坐标系、坐标轴方向

平台 / 引擎坐标系类型Up&#xff08;上&#xff09;方向Forward&#xff08;前进&#xff09;方向前进方向依据说明Unity左手坐标系YZtransform.forward 是 Z 轴正方向&#xff0c;默认摄像机朝 Z 看。Unreal Engine左手坐标系ZXUE 的角色面朝 X&#xff0c;默认使用 GetActor…

Cold Diffusion: Inverting Arbitrary Image Transforms Without Noise论文阅读

冷扩散&#xff1a;无需噪声的任意图像变换反转 摘要 标准扩散模型通常涉及两个核心步骤&#xff1a;图像降质 &#xff08;添加高斯噪声&#xff09;和图像恢复 &#xff08;去噪操作&#xff09;。本文发现&#xff0c;扩散模型的生成能力并不强烈依赖于噪声的选择&#xf…

Java并发编程核心组件简单了解

一、Lock体系 1. ReentrantLock&#xff08;可重入锁&#xff09; Lock lock new ReentrantLock(); lock.lock(); try {// 临界区代码 } finally {lock.unlock(); }特点&#xff1a;可重入、支持公平/非公平策略优势&#xff1a;可中断锁获取、定时锁等待使用场景&#xff1…

第二个五年计划!

下一阶段&#xff01;5年后&#xff01;33岁&#xff01;体重维持在125斤内&#xff01;腰围74&#xff01; 健康目标&#xff1a; 体检指标正常&#xff0c;结节保持较小甚至变小&#xff01; 工作目标&#xff1a; 每年至少在一次考评里拿A&#xff08;最高S&#xff0c;A我理…

Redis(三) - 使用Java操作Redis详解

文章目录 前言一、创建项目二、导入依赖三、键操作四、字符串操作五、列表操作六、集合操作七、哈希表操作八、有序集合操作九、完整代码1. 完整代码2. 项目下载 前言 本文主要介绍如何使用 Java 操作 Redis 数据库&#xff0c;涵盖项目创建、依赖导入及 Redis 各数据类型&…

【Folium】使用离线地图

文章目录 相关文献离线地图下载Folium 使用离线地图 相关文献 Folium — Folium 0.19.5 documentationOffline Map Maker 离线地图下载 我们使用 Offline Map Maker 进行地图下载。 特别注意&#xff1a;Folium 默认支持 WGS84 坐标系&#xff0c;建议下载 WGS84 坐标系的地…

DeepSearch:字节新一代 DeerFlow 框架

项目地址&#xff1a;https://github.com/bytedance/deer-flow/ 【全新的 Multi-Agent 架构设计】独家设计的 Research Team 机制&#xff0c;支持多轮对话、多轮决策和多轮任务执行。与 LangChain 原版 Supervisor 相比&#xff0c;显著减少 Tokens 消耗和 API 调用次数&#…

Qt—用SQLite实现简单的注册登录界面

1.实现目标 本次实现通过SQLite制作一个简易的登录窗口&#xff0c;当点击注册按钮时&#xff0c;登录窗口会消失&#xff0c;会出现一个新的注册界面&#xff1b;完成注册或退出注册时&#xff0c;注册窗口会消失&#xff0c;重新出现登录窗口。注册过的用户信息会出现在SQLi…

day 18:零基础学嵌入式之数据结构——

一、基础内容 1.数据结构&#xff1a;相互之间存在一种或多种特定关系的数据元素的集合。 2.逻辑结构 &#xff08;1&#xff09;集合&#xff0c;所有数据在同一个集合中&#xff0c;关系平等。 &#xff08;2&#xff09;线性&#xff0c;数据和数据之间是一对一的关系 &am…