我正在尝试使用Apache beam中的Flatten函数添加标题。但是,似乎没有办法根据文档设置顺序:https://beam.apache.org/documentation/sdks/pydoc/2.4.0/apache_beam.transforms.core.html?highlight=flatten#apache_beam.transforms.core.Flatten。
有时标题位于数据末尾,其他位于顶部。有没有办法设定订单?想知道是否有我遗失的东西。
with beam.Pipeline(options=options) as p:
header = [
('name', 'number'),
]
phones_list = [
('amy', '111-222-3333'),
('james', '222-333-4444'),
('amy', '333-444-5555'),
('carl', '444-555-6666'),
]
header = p | 'Header' >> beam.Create(header)
phones = p | 'CreatePhones' >> beam.Create(phones_list)
merged = ((phones,header)
| 'MergedPColl' >> beam.Flatten())
output = merged
output | 'Write' >> beam.io.WriteToText('./_output')
输出1:
('amy', '111-222-3333')
('james', '222-333-4444')
('amy', '333-444-5555')
('carl', '444-555-6666')
('name', 'number')
输出2:
('name', 'number')
('amy', '111-222-3333')
('james', '222-333-4444')
('amy', '333-444-5555')
('carl', '444-555-6666')
答案 0 :(得分:2)
Flatten
是一个适用于PCollections的变换器。为了使合并工作并行,我认为他们不能保证订单得到保留;这与所得到的PCollection的无序性质是一致的。
但如果您的唯一目的是在顶部添加标题,则可以使用textio.WriteToText()
的header
参数。
> header(str):作为标题在文件开头写入的字符串。如果不是:数据:
None
和 append_trailing_newlines 已设置,则会添加`\ n``。
phones | 'Write' >> beam.io.WriteToText(
# Feel free to make your own header format.
'./_output', header="('name', 'number')")
更一般地说,为了保留原始输入的序列,我会用序列号来扩充输入数据。在梁的并行变换(携带每个元素的序列号)之后,您总是可以通过对该序列号进行排序作为后处理步骤(在非并行模式下)来“恢复”原始顺序。