类型修饰符¶
Odo 根据输入的类型(例如 pd.DataFrame, sqlalchemy.Table, odo.CSV)来决定运行哪些转换函数。在许多情况下,我们希望细微的变动能够表示不同的情况,例如以下 CSV 文件之间的差异:
- 本地 CSV 文件
- 一系列 CSV 文件
- 远程机器上的 CSV 文件
- HDFS 上的 CSV 文件
- S3 上的 CSV 文件
- 完成后应删除的临时 CSV 文件
原则上,我们需要为这些类型以及它们的 JSON、TextFile 等效类型创建子类。为了简化此过程,我们创建了用于为我们生成这些子类的函数。这些函数命名如下:
chunks - a sequence of data in chunks
SSH - data living on a remote machine
HDFS - data living on Hadoop File system
S3 - data living on Amazon's S3
Directory - a directory of data
Temp - a temporary piece of data to be garbage collected
我们在类型上使用这些函数来构造新类型。
>>> SSH(CSV)('/path/to/data', delimiter=',', user='ubuntu')
>>> Directory(JSON)('/path/to/data/')
我们组合这些函数来指定更复杂的情况,例如位于 S3 上的 JSON 数据临时目录。
>>> Temp(S3(Directory(JSONLines)))
使用 URI¶
大多数用户不与这些类型交互。它们供开发人员内部使用,以指定应调用函数的场景。
chunks¶
一个特别重要的类型修饰符是 chunks,它表示某种其他类型的可迭代对象。例如,chunks(list) 表示 Python 列表的可迭代对象,而 chunks(pd.DataFrame) 表示 DataFrame 的可迭代对象。chunks 修饰符通常用于通过内存内格式在两种内存外格式之间进行转换。这也是一种以在线方式与数据交互的便捷机制。
>>> from odo import odo, chunks
>>> import pandas as pd
>>> seq = odo('postgresql://::mytable', chunks(pd.DataFrame))
>>> for df in seq:
... # work on each dataframe sequentially
chunks 也可以用于将分块的可迭代对象写入另一个资源中。例如,我们可以使用 chunks 将一系列 NumPy 数组写入 PostgreSQL 表中,同时只在内存中保留一个完整的数组,如下所示:
>>> import numpy as np
>>> from odo import odo, chunks
>>> seq = (np.random.randn(5, 3) for _ in range(3))
>>> odo(chunks(np.ndarray)(seq), 'postgresql://::mytable')
chunks(type_)(seq) 仅仅是一个包装内部序列的小盒子,它让 odo 知道序列中元素的类型。我们仍然可以像使用任何其他序列一样使用此序列,包括对其进行循环。
因为这是对内部序列的包装,所以只有当内部序列支持多次迭代时,我们才能多次迭代 chunks。例如:
>>> from odo import chunks
>>> CL = chunks(list)
>>> multuple_iteration_seq = CL([[0, 1, 2], [3, 4, 5])
>>> tuple(multuple_iteration_seq)
([0, 1, 2], [3, 4, 5])
>>> tuple(multuple_iteration_seq)
([0, 1, 2], [3, 4, 5])
>>> single_iteration_seq = CL(iter([[0, 1, 2], [3, 4, 5]]))
>>> tuple(single_iteraton_seq)
([0, 1, 2], [3, 4, 5])
>>> tuple(single_iteration_seq)
()