Estoy usando Google Cloud Dataflow con el SDK de Python.

Me gustaría :

  • Obtenga una lista de fechas únicas de una colección maestra de PC
  • Recorra las fechas de esa lista para crear PCollections filtradas (cada una con una fecha única) y escriba cada PCollection filtrada en su partición en una tabla dividida por tiempo en BigQuery.

¿Cómo puedo obtener esa lista? Después de la siguiente transformación combinada, creé un objeto ListPCollectionView pero no puedo iterar ese objeto:

class ToUniqueList(beam.CombineFn):

    def create_accumulator(self):
        return []

    def add_input(self, accumulator, element):
        if element not in accumulator:
            accumulator.append(element)
        return accumulator

    def merge_accumulators(self, accumulators):
        return list(set(accumulators))

    def extract_output(self, accumulator):
        return accumulator


def get_list_of_dates(pcoll):

    return (pcoll
            | 'get the list of dates' >> beam.CombineGlobally(ToUniqueList()))

¿Lo estoy haciendo todo mal? ¿Cuál es la mejor forma de hacerlo?

Gracias.

2
orayer 3 ene. 2017 a las 12:50

1 respuesta

La mejor respuesta

No es posible obtener el contenido de una PCollection directamente: una canalización de Apache Beam o Dataflow es más como un plan de consulta de qué procesamiento se debe realizar, con PCollection como un nodo intermedio lógico en el plan. , en lugar de contener los datos. El programa principal ensambla el plan (canalización) y lo inicia.

Sin embargo, en última instancia, está intentando escribir datos en tablas de BigQuery fragmentadas por fecha. Actualmente, este caso de uso solo es compatible con en el SDK de Java y solo para canalizaciones de transmisión.

Para un tratamiento más general de la escritura de datos en múltiples destinos según los datos, siga BEAM-92 < / a>.

Consulte también Creación / escritura en BigQuery paritonado. tabla a través de Google Cloud Dataflow

6
Community 23 may. 2017 a las 13:30