CN110909066B - 一种基于SparkSQL和RestAPI的流数据处理方法 - Google Patents

一种基于SparkSQL和RestAPI的流数据处理方法 Download PDF

Info

Publication number
CN110909066B
CN110909066B CN201911243654.6A CN201911243654A CN110909066B CN 110909066 B CN110909066 B CN 110909066B CN 201911243654 A CN201911243654 A CN 201911243654A CN 110909066 B CN110909066 B CN 110909066B
Authority
CN
China
Prior art keywords
sql
algorithm
data
udf
restapi
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201911243654.6A
Other languages
English (en)
Other versions
CN110909066A (zh
Inventor
冯凯
徐葳
王元卓
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
China Science And Technology Big Data Research Institute
Original Assignee
Big Data Research Institute Institute Of Computing Technology Chinese Academy Of Sciences
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Big Data Research Institute Institute Of Computing Technology Chinese Academy Of Sciences filed Critical Big Data Research Institute Institute Of Computing Technology Chinese Academy Of Sciences
Priority to CN201911243654.6A priority Critical patent/CN110909066B/zh
Publication of CN110909066A publication Critical patent/CN110909066A/zh
Application granted granted Critical
Publication of CN110909066B publication Critical patent/CN110909066B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/25Integrating or interfacing systems involving database management systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/28Databases characterised by their database models, e.g. relational or object models
    • G06F16/284Relational databases

Landscapes

  • Engineering & Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种基于SparkSQL和RestAPI的流数据处理方法,包括以下步骤:S1:初始化待封装的RestAPI算法库中的算法、S2:对初始化后的算法进行封装,封装成UDF格式、S3:对封装后的UDF进行注册、S4:组装流数据计算程序、S5:获取用户输入的SQL语句并执行。本发明是在传统SQL海量流数据计算的基础之上,提供了便捷的复杂算法计算支持,可以方便的使用SQL实现海量流数据的复杂算法计算能力。本发明能够实现了SQL对流数据的实时计算能力。

Description

一种基于SparkSQL和RestAPI的流数据处理方法
技术领域
本发明属于数据服务治理技术领域,具体涉及一种基于互联网大数据的服务提供方法。
背景技术
近年来,随着大数据时代的到来,数据呈现爆炸式增长,信息规模日益庞大,信息数据为企业的决策提供了坚实的信息基础,海量数据的生成对社会带来的冲击与变革是前所未有的,对于企业而言,如何快速高效的从数据中提取有用的价值成为新的挑战。传统数据以结构化数据为主,而现在来源于社交网站、电子商务、物联网的数据基本都是非结构化和半结构化的数据,传统数据用关系型数据库的管理系统可以实现有效的管理与使用,而现在数据因其大量、迅速、复杂、大大超出了传统数据库软件工具的能力范围,根据IDC报告,预计到2020年,全球数据使用量将达到35.2ZB,在如此海量的数据面前,处理数据的效率就意味着企业是否具备相应能力与竞争力,所以需要有一套易用、高可靠、高性能的数据分析系统。
公开号为CN108268639A的“一种大数据环境下的指标计算方法”提供了一种大数据环境下的指标计算方法,分离了指标计算调度代码和业务计算SQL,将数据的读取、预处理、计算、结果存储的SQL全部放入数据库,新增一个指标,只需要几条sql就能达到目的,基本上实现了零代码增加需求,但是此方案只能利用已有的SQL能力,无法扩展外部的RestAPI提供的算法能力,也就是无法实现复杂的SQL算法计算。
发明内容
本发明内容提供了一种基于SparkSQL和RestAPI的流数据处理方法,将基于RestAPI的复杂算法能力进行封装,提供给SQL进行组合使用,并且可以利用Spark分布式计算的特性,实现SQL级别的流数据快速复杂算法计算能力。
实现上述目的的技术方案是采用一种基于SparkSQL和RestAPI的流数据处理方法,包括以下步骤。
S1:初始化待封装的RestAPI算法库中的算法包含以下步骤;
S1.1:针对提供了RestAPI的算法库内容进行梳理;
S1.2:明确每一个复杂算法的输入和输出数据类型;
S1.3:将梳理后的信息存储到数据库中,以便后面使用;
S2:对初始化后的算法进行封装,封装成UDF格式;
S3:对封装后的UDF进行注册;
S4:组装流数据计算程序;
S4.1:首先初始化SparkSQL程序相关配置,获取SparkSession对象;
S4.2:获取输入Kafka数据源相关配置参数,根据指定的消费策略消费数据,获取DStream对象;
S4.3:根据输入Schema信息,将kafka中的数据类型映射为SparkSQL中的数据类型,先把每个原始字段根据schema转换成StructField,再把所有的StructField组装成StructType;
S4.4:根据输入Schema信息,将kafka中的每一行数据组装成一个Row对象,最终获取到一个RowRDD;
S4.5:根据StructType和RowRDD创建DataFrame,再通过DataFrame注册SparkSQL中的临时表,方便后面使用SQL查询数据;
S4.6:将步骤S3中注册的UDF函数导入这里,这样才可以在SQL中使用自定义的UDF函数;
S4.7:组装用户传递过来的SQL语句;
S4.8:获取目的地Kafka的相关配置参数以及输出Schema信息,根据输出Schema信息从SQL的执行结果中解析数据,将数据封装成Record对象,最终再把Record对象发送到目的地kafka中;
S5:获取用户输入的SQL语句并执行;
S5.1:将用户输入的SQL语句传递给步骤S4中的实时计算程序;
S5.2:SQL语句在执行的时候会调用封装在UDF中的RestAPI算法,轻松实现使用SQL对流数据的复杂算法分析;
S5.3:后期针对多种SQL计算逻辑,不需要重复开发步骤S4,因为步骤S4已经是公共的,只需要使用在步骤S3中注册的UDF写数据计算SQL即可。
进一步地,步骤S2包含以下内容:
S2.1:对步骤S1中初始化的算法进行封装
S2.2:按照SparkSQL中开发UDF(用户自定义函数)的规则和步骤进行封装
S2.3:根据S1.2步骤中梳理的算法的输入和输出数据类型,自定义UDF的时候首先继承对应的UDF接口,实现call函数中的计算逻辑,在call函数内部对提供了RestAPI的算法进行封装,方便后期在SQL中调用
进一步地,步骤S3包含以下内容:
S3.1:将封装好的UDF在SparkSQL中进行注册,供后续步骤使用,
S3.2:在注册UDF的时候,需要指定UDF的名称和自定义UDF代码的全类名。
本发明的有益效果:相对于传统的SQL海量流数据计算无法支持复杂运算,传统的复杂计算无法提供便捷的SQL语法支持。本发明方案的优点如下。
1、本发明是在传统SQL海量流数据计算的基础之上,提供了便捷的复杂算法计算支持,可以方便的使用SQL实现海量流数据的复杂算法计算能力。
2、本发明能够实现了SQL对流数据的实时计算能力。
附图说明
图1是基于SparkSQL和RestAPI的流数据处理架构图。
具体实施方式
本发明方案针对海量流数据计算,将SQL和RestAPI中的算法能力相结合的方案,在分布式计算的基础之上,实现了基于SQL的复杂算法计算能力。下面将结合附图1对本发明基于SparkSQL和RestAPI的流数据处理方法进行进一步详细说明,包括以下步骤:
S1:初始化待封装的RestAPI算法库中的算法,算法类型主要包含文本处理、数据转换、数据采样、特征抽取、参数估计、数据校验、数据评估、时序分析、模型评估、网络计算、文本分析、推荐算法、分类回归、深度学习、聚类算法等。
S1.1:针对RestAPI算法库中的内容进行梳理(此处的“梳理”表示人工整理算法库中的算法)。
S1.2:明确每一个复杂算法(复杂算法:例如TFIDF转换、词频统计、特征索引、数据切分、加权采样、分层采样、数据标准化、主成分分析、卡方选择器、奇异值分解、特征离散转换、方差比估计、比率差估计、均方差估计、正态分布校验、时间序列分析、协同过滤预测、非负矩阵分解预测、因子分解机预测、线性回归预测、逻辑回归预测、线性感知机预测、支持向量机预测、朴素贝叶斯预测、决策树预测、分类回归决策树预测、高斯混合聚类、卷积神经网络预测)的输入和输出数据类型,针对字符串数据类型统一使用string表示,整数类型统一使用long表示,小数使用float和double表示,布尔类型使用boolean表示,同时还支持array数组类型,array中可以支持string、long、float、double、boolean基本数据类型和object复杂数据类型。
S1.3:将梳理后的信息存储到数据库中,在数据库中创建表calc,字段为id、calc_name、in_param、out_param、desc,其中字段id为int类型的自增类型,in_param、out_param和desc为varchar类型,以便后面查询使用。
S2:对初始化后的算法进行封装,封装成UDF格式。
S2.1:对步骤S1中存储到数据库的算法进行封装,通过JDBC代码查询数据库中标calc中的数据,获取数据库中存储的算法的详细字段信息。
S2.2:按照SparkSQL中开发UDF(用户自定义函数)的规则和步骤进行封装,将算法库中的算法全部按照规则封装到UDF中。
S2.3:根据S1.2步骤中梳理的算法的输入和输出数据类型,自定义UDF的时候首先实现SparkSQL的UDF接口,根据输入参数的个数实现不同的接口,例如:1个输入参数需要实现udf1接口,2个输入参数需要实现udf2接口,以此类推,目前最多支持20个输入参数。然后在接口中的call函数中实现具体的业务逻辑,在call函数内部对提供了RestAPI的算法进行封装,在call函数内部使用http连接池的时候需要使用静态工具类,在静态代码块中初始化http连接池,这样可以保证在一个jvm进程中只会创建一个http连接池,否则会造成在call函数内部重复创建多个连接池,无法对连接进行复用,影响算法调用效率,严重的可能会导致http连接耗尽程序报错,call函数返回的结果其实就是自定义UDF函数返回的结果,我们在call函数内部通过http请求调用RestAPI中的对应算法,把参数传给算法,获取算法的返回结果,返回结果的格式我们使用json格式,例如:{"error","ok","ignore":true,"field1":"res1","field2":"res2"},其中的error字段和ignore字段属于公共字段,表示解析出现问题的时候是否保留数据,后面的field1和field2属于业务字段,根据不同的算法会返回不同的业务字段,返回的业务字段的个数没有限制。
S3:对封装后的UDF进行注册。
S3.1:将封装好的UDF在SparkSQL中进行注册,通过SparkSQL中的register函数进行注册,由于一个SparkSQL中可能会使用多个UDF,所以需要把使用到的UDF信息都在这里进行注册,注册了之后程序就可以识别这个UDF了。
S3.2:在注册UDF的时候,需要指定UDF的名称、UDF的入口类全类名、UDF的参数列表和UDF的返回值类型,其中UDF的名称就是最终注册生成的函数的名称,这个名称建议以func_开头,按照这个规则统一命名,后期在使用和维护的时候都比较方便,我们会根据UDF的入口类全类名使用java的反射机制生成对应的实例对象。
S4:组装流数据计算程序。
S4.1:首先初始化SparkSQL程序相关配置,先创建SparkConf对象,在里面指定Spark集群和任务的基本信息,再根据SparkConf对象获取StreamingContext对象,在这里需要指定流计算的间隔,最小时间为1秒,在这里我们设置为5秒,表示每隔5秒实时程序计算一次,最后SparkSession中builder构建器构建SparkSession对象。
S4.2:获取输入Kafka数据源相关配置参数,根据指定的消费策略消费数据,通过KafkaUtils中的createDirectStream方法创建一个数据流,此方法会返回一个DStream对象,这个DStream对象中就包含了Kafka数据流中的数据,后面就需要基于这个DStream对象进行操作。
S4.3:根据输入Schema信息,将kafka中的数据类型映射为SparkSQL中的数据类型,先把kafka中数据的每个原始字段类型根据schema组装成SparkSQL中的StructField对象,再把所有字段对应的的StructField对象组装成StructType对象,这样就对kafka中的原始数据进行了描述,转换成了SparkSQL可以识别的数据类型。
S4.4:根据输入Schema信息,获取kafka中的每一行数据中的字段值,根据Schema将字段值转换成SparkSQL中可以识别的格式,把一行数据中的多个字段内容组装到一个Row对象中,最终可以获取到一个RowRDD,这里面包含了转换之后的数据
S4.5:根据步骤S4.3中产生的StructType对象和步骤S4.4中产生的RowRDD对象创建DataFrame,再通过DataFrame在SparkSQL中创建临时表,这个表里面就包含了kafka中的数据,方便我们后面使用SQL查询数据。
S4.6:将步骤S3中注册的UDF函数导入这里,这样我们就可以在SQL中使用自定义的UDF函数了。
S4.7:组装用户传递过来的SQL语句,对SQL得语法进行合法性校验,根据输入schema和输出schema判断SQL中的字段信息是否有未知字段,如果有,需要及时提示用户修改,最后还需要确保SQL中操作的表名和步骤S4.5中创建的临时表的表名保持一致,在这里建议使用一个统一的表名,避免后期使用的时候由于表名异常发生错误。针对自定义的UDF函数中返回多个字段的情况,在写SQL的时候需要通过lateral view这个单条转多条函数和json_tuple函数从自定义UDF函数的结果中解析需要的字段信息。
S4.8:获取目的地Kafka的相关配置参数以及输出Schema信息,通过调用Spark中的foreachPartition函数获取SQL执行的结果,此处建议使用foreachPartition,而不要使用foreach,否则针对每一条结果数据都需要创建一次目的地kafka的连接信息,影响效率,根据输出Schema信息从SQL的执行结果中将对应类型的数据解析出来,在解析的时候要尤其注意array这种复杂嵌套数据类型,最终将数据封装成Record对象,这个Record对象中不仅仅包含了结果数据,也包含了结果数据对应的schema信息,最终再把Record对象通过Kafka中的生产者发送到目的地kafka中。
S5:获取用户输入的SQL语句(SQL语句指的是一行SQL)并执行。
S5.1:将用户输入的SQL语句传递给步骤S4中的实时计算程序。
S5.2:SQL语句在执行的时候会调用封装在UDF中的RestAPI算法,轻松实现使用SQL对流数据的复杂算法分析。
S5.3:后期针对多种SQL计算逻辑,不需要重复开发步骤S4,因为步骤S4已经是公共的,只需要使用在步骤S3中注册的UDF写数据计算SQL即可。
本发明上述内容通过对RestAPI中的算法能力进行封装注册,提供丰富的UDF(用户自定义函数)功能,和SQL结合使用,解决了SQL无法对流数据提供复杂算法计算的问题,可以方便的使用SQL实现海量流数据的实时推荐、分类、聚类等能力,并且也可以简化代码开发量,后期开发计算程序只需要写SQL即可。

Claims (3)

1.一种基于SparkSQL和RestAPI的流数据处理方法,其特征在于,包括以下步骤:
S1:初始化待封装的RestAPI算法库中的算法,包含以下步骤:
S1.1:针对提供了RestAPI的算法库内容进行梳理;
S1.2:明确每一个复杂算法的输入和输出数据类型,复杂算法指的是TFIDF转换、词频统计、特征索引、数据切分、加权采样、分层采样、数据标准化、主成分分析、卡方选择器、奇异值分解、特征离散转换、方差比估计、比率差估计、均方差估计、正态分布校验、时间序列分析、协同过滤预测、非负矩阵分解预测、因子分解机预测、线性回归预测、逻辑回归预测、线性感知机预测、支持向量机预测、朴素贝叶斯预测、决策树预测、分类回归决策树预测、高斯混合聚类、卷积神经网络预测中的任意一种;
S1.3:将梳理后的信息初始化到数据库中,以便后续使用;
S2:对初始化后的算法进行封装,封装成UDF格式;
S3:对封装后的UDF进行注册;
S4:组装流数据实时计算程序,包含以下步骤:
S4.1:首先初始化SparkSQL程序相关配置,获取SparkSession对象;
S4.2:其次获取Kafka数据源相关配置参数,根据指定的消费策略消费数据,获取DStream对象;
S4.3:根据Kafka中的topic信息获取对应数据的Schema信息,组装DataFrame,注册临时表;
S4.4:将注册临时表引入步骤S3中注册的UDF函数;
S4.5:然后组装用户传递过来的SQL语句;
S4.6:最后获取目的地Kafka的相关配置参数以及对应Topic数据的Schema信息,根据Schema信息从SQL的执行结果中解析数据,将结果保存到对应的存储数据库中;
S5:获取用户输入的SQL语句并执行,包含以下步骤:
S5.1:将用户输入的SQL语句传递给步骤S4中的实时计算程序;
S5.2:SQL语句在执行的时候会调用封装在UDF中的RestAPI算法,实现使用SQL对流数据的复杂算法分析。
2.根据权利要求1所述的基于SparkSQL和RestAPI的流数据处理方法,其特征在于,步骤S2包含以下内容:
S2.1:对步骤S1中初始化的算法进行封装;
S2.2:按照SparkSQL中开发用户自定义函数 UDF的规则和步骤进行封装;
S2.3:根据S1.2步骤中梳理的算法的输入和输出数据类型,自定义UDF的时候首先继承对应的UDF接口,实现call函数中的计算逻辑,在call函数内部对提供了RestAPI的算法进行封装,方便后期在SQL中调用。
3.根据权利要求1所述的基于SparkSQL和RestAPI的流数据处理方法,其特征在于,步骤S3包含以下内容:
S3.1:将封装好的UDF在SparkSQL中进行注册,供后续步骤使用;
S3.2:在注册UDF的时候,需要指定UDF的名称和自定义UDF代码的全类名。
CN201911243654.6A 2019-12-06 2019-12-06 一种基于SparkSQL和RestAPI的流数据处理方法 Active CN110909066B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911243654.6A CN110909066B (zh) 2019-12-06 2019-12-06 一种基于SparkSQL和RestAPI的流数据处理方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911243654.6A CN110909066B (zh) 2019-12-06 2019-12-06 一种基于SparkSQL和RestAPI的流数据处理方法

Publications (2)

Publication Number Publication Date
CN110909066A CN110909066A (zh) 2020-03-24
CN110909066B true CN110909066B (zh) 2021-03-16

Family

ID=69823300

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911243654.6A Active CN110909066B (zh) 2019-12-06 2019-12-06 一种基于SparkSQL和RestAPI的流数据处理方法

Country Status (1)

Country Link
CN (1) CN110909066B (zh)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111638883B (zh) * 2020-05-14 2023-05-16 四川新网银行股份有限公司 基于决策树的决策引擎实现方法
CN111694846B (zh) * 2020-06-04 2023-08-29 贵州易鲸捷信息技术有限公司 一种基于Type 2 JDBC驱动的分离模式分布式存储过程实现方法
CN111857675B (zh) * 2020-08-03 2023-07-11 北京思特奇信息技术股份有限公司 基于c++实现restful服务的方法及系统
CN112163030A (zh) * 2020-11-03 2021-01-01 北京明略软件系统有限公司 多表批量操作方法、系统及计算机设备
CN113760877A (zh) * 2021-03-10 2021-12-07 中科天玑数据科技股份有限公司 一种基于标准sql的流式数据清洗转换方法和系统
CN113590686B (zh) * 2021-07-29 2023-11-10 深圳博沃智慧科技有限公司 生态环境数据指标的处理方法、装置及设备
CN113934752B (zh) * 2021-12-17 2022-06-03 中证信用增进股份有限公司 基于Spark组件的数据处理方法、装置、设备及介质

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103886203B (zh) * 2014-03-24 2017-01-11 美商天睿信息系统(北京)有限公司 一种基于指标预测的自动建模系统及其方法
US10216582B2 (en) * 2016-08-15 2019-02-26 International Business Machines Corporation Recovery log analytics with a big data management platform
CN110162556A (zh) * 2018-02-11 2019-08-23 陕西爱尚物联科技有限公司 一种有效发挥数据价值的方法
CN108446570A (zh) * 2018-02-28 2018-08-24 四川新网银行股份有限公司 一种数据脱敏方法及装置
CN109618308A (zh) * 2018-12-28 2019-04-12 济南浪潮高新科技投资发展有限公司 一种基于Spark Streaming处理物联网数据的方法

Also Published As

Publication number Publication date
CN110909066A (zh) 2020-03-24

Similar Documents

Publication Publication Date Title
CN110909066B (zh) 一种基于SparkSQL和RestAPI的流数据处理方法
CN103064875B (zh) 一种服务化空间数据分布式查询方法
CN111526060A (zh) 业务日志的处理方法及系统
Bockermann et al. The streams framework
US7984031B2 (en) Query builder for testing query languages
CN103262076A (zh) 分析数据处理
US20130173643A1 (en) Providing information management
CN102200974A (zh) 一种用于搜索引擎的统一信息检索智能体系统与方法
CN111680147A (zh) 一种数据处理方法、装置、设备以及可读存储介质
CN112434024B (zh) 面向关系型数据库的数据字典生成方法、装置、设备及介质
CN111198898B (zh) 大数据查询方法及大数据查询装置
CN102123172A (zh) 一种基于神经网络聚类优化的Web服务发现的实现方法
CN117093599A (zh) 面向异构数据源的统一sql查询方法
CN111813870B (zh) 基于统一描述表达的机器学习算法资源共享方法及系统
CN115641162A (zh) 一种基于建筑工程造价的预测数据分析系统和方法
CN117251414B (zh) 一种基于异构技术的数据存储及处理方法
CN113553341A (zh) 多维数据分析方法、装置、设备及计算机可读存储介质
CN113297251A (zh) 多源数据检索方法、装置、设备及存储介质
CN113157814B (zh) 关系数据库下查询驱动的智能工作负载分析方法
CN115858622A (zh) 一种业务数据核对脚本的自动化生成方法
CN113221528B (zh) 基于openEHR模型的临床数据质量评估规则的自动生成与执行方法
CN114358910A (zh) 异常财务数据处理方法、装置、设备及存储介质
CN113934430A (zh) 数据检索分析方法、装置、电子设备及存储介质
CN117251472B (zh) 跨源数据处理方法、装置、设备及存储介质
Tripathi et al. Generating Structured Database Queries Using Deeply-Bidirectional Natural Language Encodings

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
CP01 Change in the name or title of a patent holder
CP01 Change in the name or title of a patent holder

Address after: 450000 8 / F, creative island building, no.6, Zhongdao East Road, Zhengdong New District, Zhengzhou City, Henan Province

Patentee after: China Science and technology big data Research Institute

Address before: 450000 8 / F, creative island building, no.6, Zhongdao East Road, Zhengdong New District, Zhengzhou City, Henan Province

Patentee before: Big data Research Institute Institute of computing technology Chinese Academy of Sciences

OL01 Intention to license declared
OL01 Intention to license declared