用于将类似nosql的数据保存到各种后端的工具。
oxtie的Python项目详细描述
简介
python oxtie 包是一个通过 将数据保存并加载到各种后端(特别是 云)它适合于低级序列化/反序列化之上的某个地方 pickle、json、msgpack等工具,但在 像postgres或mongodb这样的数据库。
oxtie的目标是成为一个轻量级的加载/保存系统 以后端不可知的方式提供数据。
安装
您可以通过类似于
$ pip install oxtie
示例用法
oxtie试图回答的主要问题是"我应该在哪个后端 用于以简单高效的方式存储我的python对象?"。这个 答案是"你不必选择;使用Oxtie,你可以很容易地改变 您喜欢的后端。"
最简单的例子
作为一个如何使用oxtie的简单示例,请考虑以下内容 例子:
>>>fromoxtie.backsimportsimple# Import some simple backends>>>tfbackend=simple.TempFileBackend()# Choose a temp file backend>>>fromoxtie.frontsimportbase# Import front ends>>>classMyClass(base.Frontend):# Define your own class...'Simple sub-class of Frontend so it can save data'...>>>f=MyClass(facets={'my_name':'test_item'},backend=tfbackend)>>>f.arbitrary_data='you can set whatever data you want'>>>f.save()# Backend will save
只需从base.frontend继承并选择后端,就可以 调用对象的save方法,它将在 所需的后端。您可以使用s3、文件系统或任何其他 只需更改一行即可支持后端。
以后可以通过以下方式加载对象:
>>>g=tfbackend.load({'my_name':'test_item'},front_cls=MyClass)>>>f.arbitrary_data==g.arbitrary_dataTrue
oxtie 用来保存/加载的关键是 facets 字典。 默认情况下, facets 中不以下划线开头的所有键 已使用,但您可以按后面的说明自定义此项。
另一个例子
您可以使用 oxtie 来处理复杂的数据结构。到 举例来说,假设您想以某种方式保存pandas数据帧。 首先,您要做的通常事情是导入熊猫并创建 数据帧:
>>>importpandas# So we can make a dataframe.>>>data={'estimate':[.17,None]}# Make example data>>>frame=pandas.DataFrame(data,index=['2017-07-01','2017-10-01'])
接下来,您可以从 oxtie 通过某种方式将数据帧存储为临时文件 喜欢:
>>>fromoxtie.frontsimportspecials# Illustrate special example>>>fromoxtie.backsimportsimple# Import simple backends>>>backend=simple.TempFileBackend()# Choose a temp file backend>>>f=specials.nums.SimpleFrame({'name':'test'},backend=backend,frame=frame)>>>f.arbitrary='You can also save arbitrary data in SimpleFrame'>>>f.save()# Now save the frame.
你本可以做些
从oxtie.backs导入aws以获取不同的后端并使用
backend=
aws.s3backend('prefix',
'bucket')
保存到amazon s3。或
如果你喜欢发电机,你可以用
后端=aws.dynamobackend(表名,
键字段={'primary':['name']})
用主键将数据保存到表中
primary
改为从
name
方面构建。关键是
继续我们的例子,一旦你想加载你的数据,你可以 以下(可能在另一个python会话中):
>>>g=backend.load({'name':'test'},allow_load=True)>>>g.__class__.__name__'SimpleFrame'>>>g.frame.to_csv()==f.frame.to_csv()# Compare CSVs to handle NonesTrue>>>g.arbitrary==f.arbitrary# Aribitrary properties also matchTrue
注意,在上面的示例中,我们提供了 allow_load=true 指示 后端可以动态地找出哪些python类 将数据加载到。如果你不喜欢动态加载,有 指定要加载到其中的类的各种方法。
为什么是前端?
你可能想知道为什么我们需要像 简单名称 。如果你真的想,你可以用 后端本身是pickle或 数据库对象关系管理器(ORM)的更有限版本。在 不过,一般来说,有一个后端协议和一个 前端类,这样你可以更聪明地做 控制序列化/反序列化、处理标题等。
作为一个非常简单的例子,您可以修改前面的例子 通过
>>>facets=f.get_facets_dict()>>>facets['_timezone']='US/Eastern'>>>f.save()
由 f.get_facets_dict()返回的字典用作头 存储简单的"facet"(facet类似于"attribute",但我们使用 别字以免混淆使用python的se oxtie"facets" "属性")。这些特殊的方面比通常的有一个优点 python属性是您可以执行类似的操作。
>>>h=backend.load({'name':'test'},only_hdr=True)>>>print('name:tz = %s:%s'%(...h['_facets']['name'],h['_facets']['_timezone']))name:tz=test:US/Eastern
在上面,我们使用 only_hdr=true 选项来 后端。 首先只加载标题。这通常是一个更便宜和更快的 操作,而不是反序列化和加载完整对象。其中之一 这个头字典包含一个包含 由 get_facets_dict() 提供的字典。因此,我们可以 查看标题以查看时区并执行如下操作:
- 对于时区错误的对象,跳过满载。
- 反序列化的方式不同,具体取决于方面中的内容,如 时区。
实际上, simpleframe 类就是这样做的。如果你装满了 对象并打印帧,您将看到,尽管我们保存了一个熊猫 没有时区信息的数据帧,类看起来 对于facets中的 "时区" ,并适当地本地化 装载量:
>>> print(backend.load({'name': 'test'},allow_load=True).frame.index[0]) 2017-07-01 00:00:00-04:00
主要功能
oxtie 包旨在简化数据的加载和保存 具有以下主要功能的不同后端:
- 内置 oxtie 后端可以轻松地将数据存储到本地 数据库、本地文件、amazon s3、amazon dynamodb和其他云 提供者。
- 支持序列化和存储熊猫数据帧对象。
- 能够轻松实现自己的后端存储以保存/加载 到/从。
-
能够将后端与序列化分离。
- 您可能希望以json、bson、msgpack等格式序列化。 csv、pickle等,但 将 存储在后端,如本地文件、s3, 等等。使用oxtie,您可以随心所欲地进行混合和匹配。
- 能够在加载 完整的对象,以便您可以廉价地扫描存储的数据 加载什么/如何加载。
- 能够构建智能前端进行验证或其他 加载或保存操作。
这些功能可能看起来有些标准和通用,因此可能值得 强调对创建"oxtie"影响最大的一个:快速 加载/扫描头信息。在现代主要数据系统的模型中 许多组织都希望做好三件事:
- 保存数据。
- 获取您知道密钥的数据。
- 根据一些简单的搜索条件查找密钥。
在早期,sql数据库很好地实现了3。你可以 编写任意复杂的查询,让您可以使用 查找要加载的数据的条件。后来人们发现你 通常有不需要搜索的二进制大对象(blob) 加上你想搜索的标题信息。这导致了NoSQL 以更有限的代价大大提高性能的数据库 搜索条件。自从nosql成功以来,云存储移动了很多东西 更进一步提供更为有限的搜索能力(如亚马逊 S3或Amazon Dynamodb)。
在许多云存储系统中,您可以有效地将数据分为 一些简单的头信息或方面,如名称或上次更新 时间或区域以及不可搜索的数据。你的存储和 搜索操作本质上只涉及标题,因此 效率高。
假设你订阅这个小标题+大正文的范例,你可以 开始意识到简单的保存/加载/扫描方法在 有很多不同的系统,为什么要硬编码应用程序 依赖于特定的后端?答案是你不应该!使用 牛津大学!
理想情况下,人们甚至可以更进一步地定义一种简单的语言 用于搜索加载扫描(SLS)操作的独立协议,类似于 可以是imp的sql标准有多种语言的柠檬味。用 一个SLS标准,你可以灵活地保存像熊猫这样的东西 从python到s3(或其他后端)的数据帧,然后加载到 在其他语言的适当结构中。牛津大学 打包是这条道路上的第一步。