一、名词解释
1.1、 .proto 文件的基本概念
一个 .proto 文件主要包含以下内容:
syntax: 指定使用的 Protocol Buffers 版本(通常是 proto2 或 proto3)。
package: 定义包名以避免命名冲突。
import: 引用其他 .proto 文件中的定义。
message: 定义数据结构。
enum: 定义枚举类型。
service: (可选)定义 RPC(远程过程调用)服务接口
1.2、 Descriptor 文件的基本概念
在 Protocol Buffers(Protobuf)的上下文中,指的是使用 protoc 编译器从 .proto 文件生成的一种元数据文件。这种文件通常被称为 FileDescriptorSet,它包含了 .proto 文件中定义的所有消息、枚举类型、服务等结构化信息的描述。Descriptor 文件主要用于动态解析 Protobuf 消息,而不需要预先生成的特定语言绑定代码
二、PB文件内容字段解析流程
2.1、pb文件转化为descriptor文件
执行转化命令:protoc --descriptor_set_out=/data/test.description /data/test.proto --proto_path=/data
2.2、解析descriptor文件类、字段描述元信息
//com.google.protobuf.Descriptors
DescriptorProtos.FileDescriptorSet descriptorSet =
DescriptorProtos.FileDescriptorSet.parseFrom(new FileInputStream(descriptionFilePath));
DescriptorProtos.FileDescriptorProto fileDescriptorProto = descriptorSet.getFileList().get(0);
Descriptors.FileDescriptor fileDescriptor =
Descriptors.FileDescriptor.buildFrom(fileDescriptorProto, new Descriptors.FileDescriptor[]{});
String javaPackage = fileDescriptor.getOptions().getJavaPackage();
String javaOuterClassname = fileDescriptor.getOptions().getJavaOuterClassname();
List<Descriptors.Descriptor> descriptors = fileDescriptor.getMessageTypes();
参考Flink源码中的flink-protobuf模块,PbToRowTypeUtil工具类,解析Descriptors.Descriptor对象转换为flink的RowType类型
image.png
通过Flink RowType 获取对应的List<RowField> 其中RowField由字段名、字段类型组成,再转换成期望的Hive Type
image.png