从postgres生成avro文件的实用程序。
pg2avro的Python项目详细描述
pg2avro
将gres发送到avro生成器。
功能
- 从列定义生成avro架构。
- 生成avro序列化的数据格式消耗品。
用法
正在生成架构
方法:pg2avro.get_avro_schema
get_avro_schema(
"mytable",
"public",
[
# Dictionary mode
{
"name": "column_name_1",
"type": "int2",
"nullable": False,
},
# SqlAlchemy mode
SqlAlchemyColumn(ARRAY(TEXT), name="column_name_2"),
...
]
)
模式生成器需要以下信息:
- 表名
- 命名空间(
schema
在sql中,dataset
在大查询中等) - columns-iterable of columns,每个元素具有:
- 姓名
- type-
_
前缀用于指示数组类型 - 可为空(可选,如果未提供,则假定为
True
)
- 列映射-具有列映射的可选
ColumnMapping
对象(有关详细信息,请参见下文)。
列数据可以多种格式传递。
支持的列格式
- 带所需键和数据的字典
- sqlalchemy列对象
- 任何具有兼容属性和所需数据的对象
- 具有所需数据但没有兼容属性/键的字典或对象,随ColumnMapping提供。
注意:此模式支持从原始postgres数据生成架构-udt_name
可用于生成架构。
columns = [
CustomColumn(name="column_name", udt_name="int2", is_nullable=False),
]
get_avro_schema(
table_name,
namespace,
columns,
ColumnMapping(name="name", type="udt_name", nullable="is_nullable"),
)
生成行数据
方法:pg2avro.get_avro_row_dict
此方法需要使用行数据和架构生成行。
支持的行格式
- 具有对应于架构字段名的键的字典
- 对象,其键与架构字段名相对应(其工作方式与具有相应字段的字典相同)
- 数据顺序与模式中指定的字段相同的元组
columns = [
{"name": "name", "type": "varchar", "nullable": False},
{"name": "number", "type": "float4", "float4", "nullable": False},
]
schema = get_avro_schema(table_name, namespace, columns)
rows = [
{"name": "John", "number": 1.0},
RowObject(name="Jack", number=2.0),
("Jim", 3.0),
]
data = [get_avro_row_dict(row, schema) for row in rows]