0%

查询map字段

建表语句

1
2
3
4
5
create table test_map(name string, score map<string,int>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'

Collection Functions

The following built-in collection functions are supported in Hive:

返回类型 函数 描述
int size(Map<K.V>) 返回map的元素数量
int size(Array<T>) 返回数组的元素数量
array<K> map_keys(Map<K.V>) 数组形式返回map中所有的key
array<V> map_values(Map<K.V>) 数组形式返回map中所有的value
boolean array_contains(Array<T>, value) 如果数组中包含该value则返回true
array<T> sort_array(Array<T>) 按照自然排序对数组进行排序

查询张三的成绩单中有数学的记录

1
select name,score from user_profile where name='张三' and array_contains(map_keys(score),'数学') limit 10;

scala偏函数

scala提供了一个PartialFunction偏函数的特质,可以对集合进行条件过滤之后操作,相当于filter+map操作,

例如:将某个包含有多种数据类型的集合进行筛选,选出Int类型进行操作

PartialFunction特质中有两个抽象的方法需要进行实现,isDefinedAt方法就是判断元素是否符合条件,只有符合条件的才会去执行apply方法

1
2
3
4
5
6
7
8
9
10
11
// 偏函数的两个泛型,第一个泛型是入参的类型,第二个泛型是返参的类型
def partFun = new PartialFunction[Any,Int] {
// 进行条件过滤,为true的才会执行apply方法
override def isDefinedAt(x: Any): Boolean = {
x.isInstanceOf[Int]
}

override def apply(v1: Any): Int = {
v1.asInstanceOf[Int]*2
}
}
阅读全文 »

scala模式匹配

scala的模式匹配与java中的switch…case类似,不过比switch要强大,模式匹配语法中,采用 match 关键字声明,每个分支采用 case 关键字进行声明,当需要匹配时, 会从第一个 case 分支开始,如果匹配成功,那么执行对应的逻辑代码,如果匹配不成功,继续执行下 一个分支进行判断。如果所有 case 都不匹配,那么会执行 case _ 分支,类似于 Java 中 default 语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
val operator = '*'
val num1 = 10
val num2 = 2
// => 后为执行的代码块,匹配到之后执行完代码块自动退出,不需要break
// 如果没有匹配到,则执行case _ 默认操作
val result = operator match {
case '+' => num1 + num2
case '-' => num1 - num2
case '*' => num1 * num2
case '/' => num1 / num2
case '%' => num1 % num2
case _ => throw new Exception("操作错误")
}

// 20
println(result)
阅读全文 »

scala集合操作

高阶函数

高阶函数就是可以接受函数参数的函数,也可以返回函数类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// f:Int => Int  表示一个函数,接收Int类型参数,返回Int
// n1:Int 是一个普通参数
def test (f:Int => Int,n1:Int) :Int = {
// 执行所传入的函数
f(n1)
}

def double(d : Int) = {
2 * d
}

// f: () => Unit表示无参,返回值为Unit
def test2(f: () => Unit): Unit ={

}

// 注意传入的double函数不需要加(),如果加了()表示的是将操作结果传递到test函数中
println(test(double,2))
阅读全文 »

MySQL忽略大小写问题

今天使用MySQL查询时遇到一个问题,使用一个字符串去查询时,查出来两条数据,但是查到的数据大小写并不一样

1
2
3
4
5
6
7
mysql> select * from good where name = 'a';
+----+------+-------+
| id | name | price |
+----+------+-------+
| 3 | a | 100 |
| 4 | A | 100 |
+----+------+-------+

我查到了name为a和A的两条数据,这就很奇怪,难道mysql会忽略大小写吗?

然后查了一下资料,说是utf8_general_ci中的_ci是指忽略大小写Case-insensitive,但是我只设置了字符编码utf8,没有设置为utf8_general_ci呀,原来utf8默认的是就是utf8_general_ci

1
2
-- 查看字符集
show collation;
阅读全文 »