avro记录类和特定记录读取器生成器

avro-gen的Python项目详细描述


阿伏罗根
======== < BR>< BR>[构建状态](https://travis-ci.org/rbystrit/avro_gen.svg?branch=master)(https://travis-ci.org/rbystrit/avro_gen) < BR>[codecov](https://codecov.io/gh/rbystrit/avro-gen/branch/master/graph/badge.svg)(https://codecov.io/gh/rbystrit/avro-gen)
avro记录类和特定的记录读取器生成器。 < BR>
python中当前的avro实现完全是typelss,并且在dict上操作。
虽然在许多情况下,这是方便和蟒蛇式的,但无法发现模式
通过查看代码,在记录构造期间不强制使用模式,并且没有
IDE的上下文帮助可能会妨碍开发人员的性能并引入错误。 < BR>
本项目旨在通过提供混凝土施工发电机来纠正这种情况
记录类并构造一个封装avro datumreader并返回具体类的读取器
而不是听写。为了不破坏avro的内部结构,这个功能是严格构建的
在datumreader和所有特定的记录类dict wrappers之上定义访问器
为架构中的每个字段提供适当类型提示的属性。正因为这个原因
生成器不提供重载的dictwriter;每个特定记录似乎只是
常规字典。 < BR>
用法:
架构json="…"
输出目录="…"
从avrogen导入写模式文件 < BR>
写入模式文件(模式json,输出目录) < BR>
生成器将创建不存在的输出目录,并将生成的文件放在那里。
生成的文件将是: < BR>
>;输出目录
>;+初始化
>;+架构类.py
>;+子模块* < BR>
为了处理avro名称空间,因为python不支持循环导入,生成器
将所有记录作为嵌套类发送到schema_classes.py。最高级的班级
schemaClass,其子类将是表示命名空间的类。每个命名空间类将
依次包含属于该命名空间的记录的类。 < BR>
考虑以下模式: < BR>
{"type":"record","name":"tweet","namespace":"com.twitter.avro","fields":[{"name":"id","type":"long"} < BR>
那么schema_classes.py将包含: < BR>
类架构类(对象):
类COM(对象):
类twitter(对象):
acro类(对象):
类TweetClass(dictWrapper):
定义初始化(自,内部盘符=无):

@属性
定义ID(自身):
"
:r类型:长
"
返回self.\u inner_dict.get('id',none) < BR>
@id.setter
定义ID(自身,值):
"
:参数长值:
"
自我.\u内部_dict['id']=值 < BR>
以便将特定的记录类型和命名空间映射到模块,以便正确导入
受支持时,生成器将在每个命名空间的输出目录下创建一个子模块
将导出该命名空间中包含的所有类型的名称。用空声明的类型
命名空间将从根模块导出。 < BR>
因此,对于上面的示例,输出目录如下所示: < BR>
>;输出目录
>;+初始化
>;+架构类.py
>;+com
>;+推特
>;+avro < BR>初始时间 < BR>
output-dir/com/twitter/avro/\\\u init\\.py的内容为: < BR>
从…架构类导入架构类
tweet=schemaclasses.com.twitter.avro.tweet < BR>
因此在代码中,您可以说: < BR>
来自output_dir.com.twitter.avro import tweet
从output目录导入specificdataumreader作为tweetreader,模式作为您的模式
从avro导入数据文件,io
我的推特=推特() < BR>
我的推特.id=1
打开('somefile','w+b')作为f:
writer=datafile.datafilewriter(f,io.datumwriter(),您的架构)
writer.append(我的推特)
writer.close() < BR>
打开('somefile','rb')作为f:
reader=datafile.datafilereader(f,tweetreader(readers_schema=your_schema))
我的tweet1=读卡器。下一步()
读卡器。关闭() < BR>< BR>
avro协议支持 < BR>
avro协议支持的实现方式与模式支持相同。生成类
对于协议: < BR>
协议
输出目录="…"
从avrogen导入写协议文件 < BR>
写入协议文件(协议json,输出目录) < BR>
生成的代码的结构与schema的结构完全相同,但是除了
常规类型,*请求类型将在协议的根命名空间中为每个
定义了每条消息。 < BR>
支持逻辑类型 < BR>
avrogen在标准avro包的基础上实现逻辑类型,并支持
这样键入的类。若要启用逻辑类型支持,请将**use_logical_types=true**传递到架构
和协议生成器。如果实现了自定义逻辑类型,并且此类类型映射到类型
除简单类型或datetime.*或decimal.*外,然后将**custom_imports**参数传递给
生成器函数,以便导入您的类型。开箱即用的类型有: < BR>
-十进制(仅使用字符串表示) < BR>
-时间毫秒
-时间微秒
-时间戳毫秒
-时间戳微秒 < BR>
要注册自定义逻辑类型,请从avrogen.logical.logicalTypeProcessor继承,实现
抽象方法,并在
逻辑类型的名称。示例实现如下所示: < BR>
类DateLogicalTypeProcessor(LogicalTypeProcessor):
匹配类型={'int','long','float','double'} < BR>
def可以转换(self、writers架构):
返回isinstance(writers_schema,schema.primitiveschema)和writers_schema.type='int' < BR>
def validate(self,预期方案,数据):
返回IsInstance(Datum,DateTime.Date) < BR>
def convert(self,writers_schema,value)定义转换(self,writers_schema,值):
如果不是instance(值,datetime.date):
引发异常("日期转换的类型错误")
返回(值-epoch_date).total_seconds()//seconds_in_day < BR>
def convert_back(self、writers_schema、readers_schema、value):
返回epoch_date+datetime.timedelta(days=int(value)) < BR>
def不匹配(self、writers、readers模式):
如果是实例(writers_schema,schema.primitiveschema):
如果writers\u schema.type在datelogicaltypeprocessor中键入匹配的类型:
返回真
返回false < BR>
定义类型名(自身):
返回"datetime.date" < BR>
定义初始值设定项(self,value=none):
返回((
"logical.DateLogicalTypeProcessor()。如果值不是None,则转换回(none,none,%s)%"值 < BR>否则'datetime.datetime.today().date()') < BR>< BR>
要读/写支持逻辑类型的数据,请使用生成的specificdataumreader
和一个来自avro.logical的logicaldataumwriter。 < BR>< BR>< BR>< BR>< BR>

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
junit cucumber为什么会找到“runTest.java”来运行测试?   在Eclipse中找不到java KeyPairGenerator   java NotSerializableException即使在实现Serializable之后   noclassdeffounderror(java字符串连接)为什么会出现这种异常?   java Guice:将接口绑定到由动态代理创建的实例   使用Spring数据neo4j创建空间索引时发生java错误   java对于需要在50多个excel文件上运行并且每个文件平均包含25k行的项目,最佳的方法是什么   javaNIO中的java缓冲区写入/发送消息问题   如何在Java/eclipse中添加不调用super()的警告   JavaSpring:mvcUrl映射错误的id   java应该在getInstance或构造函数中使用Init方法吗?   安卓中的java空指针异常错误   java Jsoup不能完全获取原始html代码