如何在数据流

时间:2016-12-01 20:26:51

标签: google-cloud-dataflow

我试图将HashMap作为数据流管道中的侧输入传递。除了少数传递String,Int或Long之外,我找不到任何例子。我的代码:

tagList = pipeline.apply(TextIO.Read.named("tagListTextRead").from("gs://mybucket/tag-list.json"));

PCollection<Map<String,TagObject>> tagMap = tagList
            .apply(ParDo.named("allTagsToTagMap").of(new Tags.BuildTagListMapFn()));


PCollectionView<Map<String, TagObject>> tagMapView =
            allTags.apply(View.<String, TagObject>asMap());

第3个语句给出了语法错误。

The method apply(PTransform<? super PCollection<Map<String,TagObject>>,OutputT>) in the type 
     PCollection<Map<String,TagObject>> is not applicable for the arguments 
     (View.AsMap<String,TagObject>)

有人可以告诉我如何将HashMap作为数据流管道中的侧输入传递。

1 个答案:

答案 0 :(得分:3)

以下是两个不同的答案,具体取决于管道的详细信息。

  1. 如果您有PCollection<KV<K, V>>,则可以使用View.asMap()生成PCollectionView<Map<K, V>>。无需自己构建Map

  2. 如果您的PCollection<Map<K, V>>包含一个元素,那么您可以使用View.asSingleton()来支持输入。

  3. 第一个可能是最自然的,你的代码最终看起来像

    PCollectionView<Map<String, TagObject>> = pipeline
        .apply("tagListTextRead", TextIO.Read.from("gs://mybucket/tag-list.json"))
        .apply("tagsToKv", new Tags.TagToKvFunction())
        .apply("viewTags", View.<String, TagObject>asMap())
    

    展开它以显示中间值的类型:

    PCollection<String> rawTags =
        pipeline.apply("tagListTextRead", TextIO.Read.from("gs://mybucket/tag-list.json"))
    
    PCollection<KV<String, TagObject>> kvs =
        rawTags.apply("tagsToKv", new Tags.TagToKvFunction())
    
    PCollectionView<Map<String, TagObject>> =
        kvs.apply("viewTags", View.<String, TagObject>asMap())