当前位置: 首页 > 知识库问答 >
问题:

如何在Google Dataflow SDK中使视图的asList()可排序?

唐伟
2023-03-14

我们在使aslist()方法可排序时遇到了一个问题。

我们认为只需扩展View类并重写asList方法就可以做到这一点,但意识到View类有一个私有构造函数,所以我们无法做到这一点。

java prettyprint-override">@Override
protected List<T> fromElements(Iterable<WindowedValue<T>> contents) {
    Iterable<T> itr = Iterables.transform(
        contents,
        new Function<WindowedValue<T>, T>() {
          @SuppressWarnings("unchecked")
          @Override
          public T apply(WindowedValue<T> input){
            return input.getValue();
          }
        });

    LOG.info("#### About to start sorting the list !");
    List<T> tempList = new ArrayList<T>();
    for (T element : itr) {
      tempList.add(element);
    };
    Collections.sort((List<? extends Comparable>) tempList);
    LOG.info("##### List should now be sorted !");
    return ImmutableList.copyOf(tempList);
}

我们如何能够实现这一点(从aslist方法调用中获得排序列表)?

共有1个答案

商曦
2023-03-14

pCollectionViews中的类不用于扩展。只支持view.assingletonview.assingletonview.asiterableview.asmapview.asmultimap提供的基本视图类型。

要从pCollectionView获得排序列表,需要在读取后对其进行排序。下面的代码演示了该模式。

// Assume you have some PCollection
PCollection<MyComparable> myPC = ...;

// Prepare it for side input as a list
final PCollectionView<List<MyComparable> myView = myPC.apply(View.asList());

// Side input the list and sort it
someOtherValue.apply(
    ParDo.withSideInputs(myView).of(
        new DoFn<A, B>() {
          @Override
          public void processElement(ProcessContext ctx) {
            List<MyComparable> tempList =
                Lists.newArrayList(ctx.sideInput(myView));
            Collections.sort(tempList);
            // do whatever you want with sorted list 
          }
        }));

当然,您可能不想重复对其进行排序,这取决于排序的成本与将其物化为新的pcollection的成本,因此可以输出该值并将其作为新的侧输入进行读取,而不会有困难:

// Side input the list, sort it, and put it in a PCollection
PCollection<List<MyComparable>> sortedSingleton = Create.<Void>of(null).apply(
    ParDo.withSideInputs(myView).of(
        new DoFn<Void, B>() {
          @Override
          public void processElement(ProcessContext ctx) {
            List<MyComparable> tempList =
                Lists.newArrayList(ctx.sideInput(myView));
            Collections.sort(tempList);
            ctx.output(tempList);
          }
        }));

// Prepare it for side input as a list
final PCollectionView<List<MyComparable>> sortedView =
    sortedSingleton.apply(View.asSingleton());

someOtherValue.apply(
    ParDo.withSideInputs(sortedView).of(
        new DoFn<A, B>() {
          @Override
          public void processElement(ProcessContext ctx) {
            ... ctx.sideInput(sortedView) ...
            // do whatever you want with sorted list 
          }
        }));

您还可能对使用内存和本地磁盘进行较大排序的不受支持的排序器contrib模块感兴趣。

 类似资料:
  • 问题内容: 到目前为止我尝试过的是: 在createPartControl中: 但这不起作用。我的问题是,如果我调整程序窗口的大小,则滚动条不会出现在视图中。有任何想法吗? 问题答案: ScrolledComposite的Javadoc描述了两种使用方式,包括示例代码。总结一下: 您可以在控件/复合物本身上设置控件/复合物的大小 或者,您告诉您用于内容的最小大小。 目前,您什么都没做。您可以在上设

  • 嘿,对不起,我的英语不好。。。 我的 ListFragment 中有一个 ListView,带有自定义适配器。在我的布局中,我有一个按钮。按钮和整个项目/行是可单击的。我用为ImageButton实现了这一点。正如您在 getView() 方法中看到的,我捕获了一个单击操作。 这是我的布局: 现在我想知道你是否可以在不选择整个视图的情况下点击按钮,但仍然注意到背景上的点击(我知道我在列表视图中的位

  • 单击时的卡片视图正在工作。但回收器视图的区域不可单击。如何使其可点击,以便捕获卡片视图的事件。

  • 问题内容: 我已经在SO文档中编写了一个示例,以统一上述问题的答案,但是由于文档将于2017年8月8日关闭,因此,我将遵循这一广受好评和讨论的元答案的建议,并将我的示例转换为自我回答发布。 当然,我也很高兴看到任何其他方法!! 题: 我想在Django Rest Framework项目上使用非通用视图/视图集(例如:)。 当我阅读分页文档时: 仅在使用通用视图或视图集时才自动执行分页。如果您使用的

  • 概览: swift4语言模仿iOS11苹果商店基本框架页面。 特性 swift4语法,搭建页面基本结构,适合初学者学习 轻量级设计,项目结构目录清晰,让你所见即所得 适配iPhoneX、XS、XR、XSMax 功能  各Tabbbar主页面基本还原  UICollectionView和UITableView的完美灵活运用  灵活多变的导航栏,各机型完美兼容  后期有时间补上详情页,持续更新   截图

  • 我注意到XCode中的UI组件:。 根据提供的描述,我想利用它在几个不同的屏幕上显示我的应用程序的可重用组件。我一直在网上寻找一个基本的教程或一些留档,但我没有找到任何有用的东西。 请问有人能建议如何把这个连接起来并利用它吗?目前,容器视图似乎没有调整大小,这是有问题的。关于如何启用此功能的任何提示也将不胜感激。 干杯