Particionando una mesa

Bigquery permite la partición, solo por fecha, en este momento.

Supongamos que tengo un millón de filas de la tabla con el campo inserted_timestamp marca de tiempo. Supongamos que este campo tiene fechas desde hace 1 año.

¿Cuál es la forma correcta de mover los datos existentes a una nueva tabla particionada?

Editado

Vi que había una solución elegante en Java con la versión <2.0 Tablas de salida de BigQuery también elaboradas en la partición de BigQuery con flujos Beam que son para parametrizar los datos de las ventanas de nombre de tabla (o sufijo de partición).

    Pero echo de menos BigQueryIO.Write en el proyecto de haz 2.x tampoco hay ejemplos sobre el tiempo de obtención de ventana desde la función serializable de Python.

    Intenté hacer particiones en la tubería pero si falla con un gran número de particiones (funciona con 100 pero falla con 1000).

    Este es mi código hasta donde pude:

      ( 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() 

    Related of "Particionando una mesa"

    Toda la funcionalidad necesaria para hacer esto existe en Beam, aunque actualmente puede estar limitada al SDK de Java.

    Usarías BigQueryIO . Específicamente, puede usar DynamicDestinations para determinar una tabla de destino para cada fila.

    Del ejemplo de DynamicDestinations:

     events.apply(BigQueryIO.write() .to(new DynamicDestinations() { public String getDestination(ValueInSingleWindow element) { return element.getValue().getUserId(); } public TableDestination getTable(String user) { return new TableDestination(tableForUser(user), "Table for user " + user); } public TableSchema getSchema(String user) { return tableSchemaForUser(user); } }) .withFormatFunction(new SerializableFunction() { public TableRow apply(UserEvent event) { return convertUserEventToTableRow(event); } }));