0%

hive Map 字段查询全解析:从建表到复杂查询

Hive 支持 MAP 类型字段存储键值对数据(如用户成绩单、商品属性等),配合内置集合函数可高效查询和分析 Map 中的数据。本文以成绩单场景为例,详细讲解 Map 字段的建表、数据插入、常用查询及集合函数的使用,帮助开发者灵活处理键值对数据。

Map 类型表的创建与数据准备

建表语句解析

创建包含 MAP 字段的表需指定分隔符,确保 Hive 正确解析键值对结构。

建表示例
1
2
3
4
5
6
7
8
CREATE TABLE test_map (  
name STRING COMMENT '学生姓名',
score MAP<STRING, INT> COMMENT '科目-分数的键值对'
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t' -- 列分隔符(姓名与 score 之间用制表符分隔)
COLLECTION ITEMS TERMINATED BY ',' -- Map 内部键值对之间的分隔符
MAP KEYS TERMINATED BY ':'; -- Map 中键与值的分隔符(如 "数学:90" 中的 ":")
分隔符说明
  • FIELDS TERMINATED BY '\t':表中列之间的分隔符(如 张三\t数学:90,英语:85 中,张三score 字段用 \t 分隔);
  • COLLECTION ITEMS TERMINATED BY ',':Map 中多个键值对的分隔符(如 数学:90,英语:85 中用 , 分隔);
  • MAP KEYS TERMINATED BY ':':Map 中键(Key)和值(Value)的分隔符(如 数学:90 中用 : 分隔)。

插入测试数据

向 Map 类型表插入数据需遵循上述分隔符规则,示例数据格式:

1
2
3
张三	数学:90,英语:85,语文:95  
李四 数学:88,英语:92
王五 语文:80,物理:75,数学:90
插入数据语句
阅读全文 »

Scala 偏函数:精准处理集合的筛选与转换

偏函数(Partial Function)是 Scala 中一种特殊的函数,它只对满足特定条件的输入值进行处理,相当于 filter(筛选)和 map(转换)的结合体。偏函数特别适合处理包含多种类型元素的集合,能简洁地实现 “先筛选、后操作” 的逻辑。本文将详细解析偏函数的定义、使用及简化写法。

偏函数的基本概念

偏函数是仅对部分输入值有定义的函数,与普通函数(对所有输入值都有定义)形成对比。在 Scala 中,偏函数通过 PartialFunction[A, B] 特质实现,其中:

  • A 是输入参数类型
  • B 是返回值类型

PartialFunction 特质包含两个核心方法:

  1. isDefinedAt(x: A): Boolean:判断输入 x 是否符合处理条件(是否在偏函数的定义域内)。
  2. apply(x: A): B:对符合条件的输入 x 执行具体操作并返回结果。

偏函数的定义与使用

完整定义(实现特质方法)

通过实现 PartialFunction 特质的两个方法,定义一个偏函数:

1
2
3
4
5
6
7
8
// 定义偏函数:只处理 Int 类型,将其翻倍
val doubleInt: PartialFunction[Any, Int] = new PartialFunction[Any, Int] {
// 筛选条件:仅 Int 类型符合要求
override def isDefinedAt(x: Any): Boolean = x.isInstanceOf[Int]

// 处理逻辑:将 Int 类型的值翻倍
override def apply(x: Any): Int = x.asInstanceOf[Int] * 2
}

使用偏函数(通过 collect 方法)

集合的 collect 方法专门用于接收偏函数,它会先通过 isDefinedAt 筛选元素,再对符合条件的元素应用 apply 方法:

1
2
3
4
5
6
// 包含多种类型的集合
val mixedList: List[Any] = List(1, "scala", 3, 4.5, 'a', 5)

// 使用偏函数处理集合
val result: List[Int] = mixedList.collect(doubleInt)
println(result) // 输出:List(2, 6, 10)
阅读全文 »

Scala 模式匹配:超越 switch 的强大匹配机制

模式匹配是 Scala 中最具特色的功能之一,它不仅能替代 Java 中的 switch...case,还支持类型匹配、集合匹配、对象匹配等复杂场景,甚至可以结合条件判断实现灵活的逻辑分支。本文将全面解析 Scala 模式匹配的语法、特性及应用场景。

基本语法:match 与 case

Scala 模式匹配通过 match 关键字定义匹配主体,case 关键字定义分支,语法简洁且功能强大。

基本用法(类似 switch)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
val operator: Char = '*'
val num1: Int = 10
val num2: Int = 2

// 匹配运算符,执行对应计算
val result = operator match {
case '+' => num1 + num2
case '-' => num1 - num2
case '*' => num1 * num2
case '/' => num1 / num2
case _ => throw new Exception("不支持的运算符") // 默认分支,类似 default
}

println(result) // 输出:20

核心特点

  • 每个 case 分支通过 => 连接匹配条件和执行逻辑。
  • 匹配成功后自动退出(无需 break),效率高于 Java 的 switch
  • case _ 表示默认分支,匹配所有未被其他分支覆盖的情况。

与 Java switch 的区别

特性 Scala 模式匹配 Java switch
匹配类型 支持值、类型、集合、对象等 仅支持基本类型、枚举、字符串(Java 7+)
分支执行 自动退出(无需 break) 需要显式 break,否则穿透
返回值 整个 match 表达式有返回值 无返回值(需手动赋值)
默认分支 case _ default

类型匹配:根据数据类型分支

Scala 模式匹配可直接根据变量的运行时类型进行分支,无需显式调用 isInstanceOf

示例:匹配不同类型

阅读全文 »

Scala 集合操作:高阶函数与函数式编程精髓

Scala 集合的强大之处不仅在于丰富的数据结构,更在于其提供的一系列高阶函数操作。这些操作允许将函数作为参数传递,实现简洁、高效的函数式编程风格,极大提升了数据处理的灵活性和可读性。本文将深入解析 Scala 集合的核心操作(映射、过滤、化简等),并展示如何利用高阶函数简化代码。

高阶函数基础

高阶函数是指可以接收函数作为参数或返回函数的函数,是 Scala 函数式编程的基础。集合操作大量依赖高阶函数,实现对元素的批量处理。

定义与示例

1
2
3
4
5
6
7
8
9
10
11
// 高阶函数:接收一个函数参数 (Int => Int) 和一个 Int,返回 Int
def process(f: Int => Int, num: Int): Int = f(num)

// 普通函数:将输入翻倍
def double(x: Int): Int = x * 2

// 调用高阶函数(传递函数作为参数)
println(process(double, 5)) // 输出:10(等价于 double(5))

// 调用时使用匿名函数(更简洁)
println(process(x => x + 3, 5)) // 输出:8

核心特点

  • 函数作为参数时,需指定其类型(如 f: Int => Int 表示接收 Int 并返回 Int 的函数)。
  • 可直接传递命名函数(如 double)或匿名函数(如 x => x + 3)。

映射操作(map 与 flatMap)

映射操作通过传入的函数转换集合中的每个元素,生成新集合。

1. map:一对一转换

map 对集合中的每个元素应用函数,返回一个新集合(元素数量与原集合相同)。

阅读全文 »

MySQL 大小写敏感问题详解:从字符集到实际应用

MySQL 中字符串查询的大小写敏感行为,主要由字符集的校对规则(Collation) 决定,而非字符集本身。查询返回 aA 两条记录的问题,正是由于默认校对规则 utf8_general_ci 不区分大小写导致的。本文详细解析这一机制及解决方案。

核心概念:字符集与校对规则

字符集(Character Set)

定义字符的编码方式(如 utf8utf8mb4),决定如何存储字符(如 a 存储为 0x61A 存储为 0x41)。

校对规则(Collation)

定义字符的比较规则,决定如何判断两个字符是否相等。大小写敏感行为由校对规则控制,而非字符集。

常见的 utf8 系列校对规则:

  • utf8_general_cici 即 Case-Insensitive(不区分大小写),aA 被视为相等。
  • utf8_binbin 即 Binary(二进制比较),严格区分大小写,a0x61)与 A0x41)被视为不同。
  • utf8_unicode_ci:不区分大小写,但比 utf8_general_ci 更符合 Unicode 标准(如支持德语、法语特殊字符的正确排序)。

默认规则

  • 当指定字符集为 utf8 而未指定校对规则时,MySQL 会自动使用默认校对规则 utf8_general_ci(不区分大小写),这就是你遇到问题的原因。

查询当前字符集与校对规则

查看数据库的字符集和校对规则

阅读全文 »