tonglin0325的个人主页

HTML学习笔记——基础知识

1.标签

1.title标签、网站关键词、网站描述、实现网页的跳转、单标签、对标签、p标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<!-- title标签 -->
<title>我是title</title>

<!-- 网站关键词 -->
<meta name='keywords' content="切糕,卖切糕,卖切糕"/>

<!-- 网站描述 -->
<meta name='description' content="本网站介绍,要有可读性,100-200字"/>

<!-- 5秒钟后跳转到百度网 -->
<meta http-equiv='refresh' content="5;url='http://www.baidu.com'"/>
</head>



<body>

<!-- 单标签 -->
<img src="/images///images//images/dog.jpg" width="100" height="150" title="图片"/>

<!-- 对标签 -->
[百度](http://www.baidu.com)

**我是strong标签**
<p>我是p标签</p>

</body>
</html>

2.h1标签、h2标签、font标签、加粗文字、下划线、嵌套

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>

<body>

<!-- h1文章标题/只能用一次 -->
<h1>我是p标签</h1>

<!-- h2文章标题/可以用多次/权重较低 -->
<h2>我是p标签</h2>

<!-- font/color可以是英文或00ff00/size从1到7 -->
<font color="red" size="7">我是font标签</font>

<!-- 加粗文字 -->
**我是strong标签**

<!-- 嵌套 -->
<font color="red"><u><del>红色文字加下划线</del></u></font>

</body>
</html>

全文 >>

chrome插件ModHeader使用

ModHeader全名modify header,这是一款可以对HTTP请求header进行修改的插件,其支持添加模式Mod过滤器Filter

Mod可以支持对request的header,response的header进行修改,对请求进行重定向redirect等;

Filter支持对特定的URL生效这面的这些Mod

全文 >>

MySQL学习笔记——函数

常用函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
ALTER TABLE tb_emp
ADD diredate VARCHAR(20);

#插入数据
INSERT INTO tb_dept()
VALUE(4,'市场部','负责市场工作');

# concat 连接
SELECT CONCAT(NAME,sex) FROM tb_emp;

# UPPER 转换大写
SELECT UPPER(NAME) FROM tb_emp WHERE dept_id=1;

# 返回字符串长度
SELECT LENGTH(NAME) FROM tb_emp WHERE dept_id=1;

# 返回部分字符
SELECT SUBSTR(NAME,2,2) FROM tb_emp WHERE dept_id=1;

# 返回当前
SELECT NOW();

# 查询时间是1981年
SELECT * FROM tb_emp
WHERE YEAR(diredate) = 1981
AND MONTH(diredate) = 1982;

#插入时间
INSERT INTO tb_emp(NAME,sex,age,address,email,dept_id,diredate)
VALUES('ZHOU','男',33,'香港','ZHOU@163.com',2,'1988-09-09');

INSERT INTO tb_emp(NAME,sex,age,address,email,dept_id,diredate)
VALUES('CAI','女',30,'香港','CAI@163.com',2,NOW());

# 条件判断语句
SELECT NAME,sex,age '原来年龄'
CASE
WHEN age IS NULL THEN 100
ELSE age
END AS '年龄'
FROM tb_emp;

# IFNULL函数 如果字段不为NULL,则取第二个值,如果为空,择取第三个值
SELECT NAME,IFNULL(age,age+100,100) AS age2 FROM tb_emp;

# IFNULL函数 如果字段不为NULL,则直接去该值,如果为空,择取第二个值
SELECT NAME,IFNULL(age,100) AS age2 FROM tb_emp;

全文 >>

MySQL学习笔记——约束

1.数据库约束简介

1.约束是在表上强制执行的数据检验规则,约束主要用于保证数据库的完整性。

2.当表中数据有相互依赖性时,可以保护相关的数据不被删除。

3.大部分数据库支持下面五类完整性约束:

  - NOT NULL非空

  - UNIQUE Key唯一值

  - PRIMARY KEY主键

  - FOREIGN KEY外键

  - CHECK检查

4.约束作为数据库对象,存放在系统表中,也有自己的名字

5.创建约束的时机:

  -在建表的同时创建

  -建表后创建(修改表)

6.有单列约束和多列约束

2.列级约束和表级约束

列级约束直接跟在列后面定义,不再需要指定列名,与列定义之间用空格分开

表级约束通常放在所有的列定义之后定义,要显式指定对哪些列建立列级约束,与列定义之间采用英语逗号,隔开

如果是对多列建联合约束,只能使用表级约束语法

1.非空约束(NOT NULL)

全文 >>

使用confluent schema registry将protobuf schema转换成avro schema

confleunt提供了一些方法,可以将protobuf schema转换成avro schema,用于支持将kafka protobuf序列化的message落盘成avro格式的文件

1.引入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<repositories>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
<repository>
<id>confluent</id>
<url>https://packages.confluent.io/maven/</url>
</repository>
</repositories>

<dependencies>
<!--pb-->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.21.7</version>
</dependency>
<!--confluent-->
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-schema-registry</artifactId>
<version>7.1.1</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-protobuf-provider</artifactId>
<version>7.1.1</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-connect-avro-data</artifactId>
<version>7.1.1</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-connect-protobuf-converter</artifactId>
<version>7.1.1</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-connect-avro-data</artifactId>
<version>7.1.1</version>
</dependency>
<!--kafka-->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>connect-api</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>

2.定义protobuf schema

定义一个protobuf schema

1
2
3
4
5
6
7
8
9
10
11
12
syntax = "proto3";
package com.acme;

message MyRecord {
string f1 = 1;
OtherRecord f2 = 2;
}

message OtherRecord {
int32 other_id = 1;
}

编译java代码

1
2
protoc -I=./ --java_out=./src/main/java ./src/main/proto/other.proto

得到schema的java代码

3.将protobuf schema转换成avro schema

confluent schema registry在处理处理protobuf,avro,json格式的数据的时候,会统一先将其转换成connect schema格式的数据,然后再将其写成parquet,avro等具体的文件格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import com.acme.Other;
import io.confluent.connect.avro.AvroData;
import io.confluent.connect.avro.AvroDataConfig;
import io.confluent.connect.protobuf.ProtobufData;
import io.confluent.kafka.schemaregistry.protobuf.ProtobufSchema;
import io.confluent.kafka.schemaregistry.protobuf.ProtobufSchemaUtils;
import org.apache.kafka.connect.data.SchemaAndValue;

public class ProtobufToAvro {

public static void main(String[] args) {
// 初始化protobuf定义的类
Other.MyRecord obj = Other.MyRecord.newBuilder().build();
// 获取pb schema
ProtobufSchema pbSchema = ProtobufSchemaUtils.getSchema(obj);
ProtobufData protobufData = new ProtobufData();
// SchemaAndValue result = protobufData.toConnectData(pbSchema, obj);
// System.out.println(result);

AvroDataConfig avroDataConfig = new AvroDataConfig.Builder()
.with(AvroDataConfig.SCHEMAS_CACHE_SIZE_CONFIG, 1)
.with(AvroDataConfig.CONNECT_META_DATA_CONFIG, false)
.with(AvroDataConfig.ENHANCED_AVRO_SCHEMA_SUPPORT_CONFIG, true)
.build();
AvroData avroData = new AvroData(avroDataConfig);
// 先将protobuf schema转换成connect schema,然后再转换成avro schema
org.apache.avro.Schema avroSchema = avroData.fromConnectSchema(protobufData.toConnectSchema(pbSchema));
System.out.println(avroSchema);
}

}

转换的avro schema输出如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
"type":"record",
"name":"MyRecord",
"fields":[
{
"name":"f1",
"type":[
"null",
"string"
],
"default":null
},
{
"name":"f2",
"type":[
"null",
{
"type":"record",
"name":"OtherRecord",
"fields":[
{
"name":"other_id",
"type":[
"null",
"int"
],
"default":null
}
]
}
],
"default":null
}
]
}

注意:confluent在具体实现的时候,比较严谨,在protobuf的uint32(0 到 2^32 -1)的时候,会统一转换成long(-2^63 ~ 2^63-1),不会出现越界的情况,参考源码

1
2
https://github.com/confluentinc/schema-registry/blob/v7.1.1/protobuf-converter/src/main/java/io/confluent/connect/protobuf/ProtobufData.java#L1485

转换实现参考源码

1
2
https://github.com/confluentinc/schema-registry/blob/v7.1.1/avro-data/src/test/java/io/confluent/connect/avro/AdditionalAvroDataTest.java

全文 >>

Hive学习笔记——安装hive客户端

hive client安装文档

1
2
https://cwiki.apache.org/confluence/display/Hive/GettingStarted

hive 配置官方文档

1
2
https://cwiki.apache.org/confluence/display/hive/configuration+properties

hive 配置中文文档

1
2
https://www.docs4dev.com/docs/zh/apache-hive/3.1.1/reference/Configuration_Properties.html