嵌套连接导致错误400 Bad Request

时间:2015-06-02 12:49:29

标签: google-cloud-dataflow

执行多个嵌套连接时,我在使用数据流服务时收到错误400错误请求。使用本地管道运行器工作正常。下面是我想要实现的一些示例代码:

    PipelineOptions pipelineOptions = PipelineOptionsFactory.fromArgs(args).withValidation().as(PipelineOptions.class);
    Pipeline pipeline = Pipeline.create(pipelineOptions);
    Datastore datastore = getDatastore(pipelineOptions, DATASET_ID);

    addData(datastore);

    PCollection<KV<Long, DatastoreV1.Entity>> users = pipeline.apply(DatastoreIO.readFrom(DATASET_ID, makeQueryForKind("Entity1")))
            .apply(ParDo.of(new MakeKVFromParent()));
    PCollection<KV<Long, DatastoreV1.Entity>> locations = pipeline.apply(DatastoreIO.readFrom(DATASET_ID, makeQueryForKind("Entity2")))
            .apply(ParDo.of(new MakeKVFromParent()));
    PCollection<KV<Long, DatastoreV1.Entity>> cars = pipeline.apply(DatastoreIO.readFrom(DATASET_ID, makeQueryForKind("Entity3")))
            .apply(ParDo.of(new MakeKVFromParent()));

    TupleTag<DatastoreV1.Entity> carsTag = new TupleTag<DatastoreV1.Entity>();
    PCollection<KV<Long, CoGbkResult>> groupedCars = KeyedPCollectionTuple.of(carsTag, cars)
            .apply(CoGroupByKey.<Long>create());

    TupleTag<CoGbkResult> groupedCarsTag = new TupleTag<CoGbkResult>();
    TupleTag<DatastoreV1.Entity> locationsTag = new TupleTag<DatastoreV1.Entity>();
    PCollection<KV<Long, CoGbkResult>> locationData = KeyedPCollectionTuple.of(groupedCarsTag, groupedCars)
            .and(locationsTag, locations)
            .apply(CoGroupByKey.<Long>create());

    //Comment this block of code to remove the bug.
    TupleTag<CoGbkResult> locationDataTag = new TupleTag<CoGbkResult>();
    TupleTag<DatastoreV1.Entity> usersTag = new TupleTag<DatastoreV1.Entity>();
    PCollection<KV<Long, CoGbkResult>> userData = KeyedPCollectionTuple.of(locationDataTag, locationData)
            .and(usersTag, users)
            .apply(CoGroupByKey.<Long>create());

    //Do some computation on userData
    pipeline.run();

基本上我有很多用户。用户可以拥有多个位置和汽车。汽车始终连接到特定位置和用户。我想按用户和位置对汽车进行分组,这样我就知道每个用户所拥有的位置以及他在每个位置拥有的汽车。我为每个用户对这些数据进行了一些计算。

可以找到一个展示我的问题的工作示例here

提交作业时发生错误。可以找到提交的作业文件here

删除最后一个连接时,作业运行正常。有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:3)

感谢您报告此内容以及优秀的示例代码!我们已经找到了服务中的问题并正在努力修复它。在我们努力解决此问题时,您可以通过不重复使用CoGroupByKeyResult作为CoGroupByKey的输入来避免此问题。

具体而言,在这种情况下,执行以下操作会减少CoGroupByKey操作的数量,使您更容易获取数据,并避免使用CoGroupByKeyResult作为{{1}的输入}:

CoGroupByKey

通过上述内容,现在可以更轻松地访问TupleTag<DatastoreV1.Entity> carsTag = new TupleTag<DatastoreV1.Entity>(); TupleTag<DatastoreV1.Entity> locationsTag = new TupleTag<DatastoreV1.Entity>(); TupleTag<DatastoreV1.Entity> usersTag = new TupleTag<DatastoreV1.Entity>(); PCollection<KV<Long, CoGbkResult>> usersCars = KeyedPCollectionTuple .of(carsTag, cars) .and(locationsTag, locations) .and(usersTag, users) .apply(CoGroupByKey.<Long>create()); 的部分内容。例如:

CoGbkResult