【发布时间】:2017-10-13 13:26:32
【问题描述】:
Bigquery 目前只允许按日期进行分区。
假设我有一个包含 inserted_timestamp 字段的 10 亿表行。假设该字段的日期为 1 年前。
将现有数据移动到新分区表的正确方法是什么?
已编辑
我看到有一个关于 Java 版本 Sharding BigQuery output tables 的优雅解决方案也在 BigQuery partitioning with Beam streams 详细说明,即参数化表名(或分区后缀)窗口数据。
但我在 2.x 梁项目上想念BigQueryIO.Write,也没有关于从 python 可序列化函数获取窗口时间的示例。
我尝试在管道上创建分区,但如果因大量分区而失败(以 100 运行但因 1000 失败)。
这是我的代码:
( p
| 'lectura' >> beam.io.ReadFromText(input_table)
| 'noheaders' >> beam.Filter(lambda s: s[0].isdigit())
| 'addtimestamp' >> beam.ParDo(AddTimestampDoFn())
| 'window' >> beam.WindowInto(beam.window.FixedWindows(60))
| 'table2row' >> beam.Map( to_table_row )
| 'write2table' >> beam.io.Write(beam.io.BigQuerySink(
output_table, #<-- unable to parametrize by window
dataset=my_dataset,
project=project,
schema='dia:DATE, classe:STRING, cp:STRING, import:FLOAT',
create_disposition=CREATE_IF_NEEDED,
write_disposition=WRITE_TRUNCATE,
)
)
)
p.run()
【问题讨论】:
-
stackoverflow.com/questions/38993877/… 应该有一些相关的方法。另外我认为您应该能够使用 JSON 或 AVRO 而不是 CSV 来避免使用平面文件。
-
@NhanNguyen,刚刚将我的问题编辑得更具体。在 2.x 上想念它。感谢您的链接,我关注了它并且是非常相关的问题。再次感谢。
标签: python google-bigquery google-cloud-dataflow