Spark数据集groupByKey不起作用(Java)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (566)

我尝试使用Dataset的groupByKey方法。我无法弄清楚问题,找不到任何使用groupByKey的工作示例。

所以,让我指出一点,我在解决方案中寻找:

  1. 我想使用groupByKey - 有很多使用groupBy(“key”)的例子.agg(函数),我知道它但不想使用它们(教育目的)
  2. 我想使用Java - 很多例子都使用Scala,再次不想要它。
  3. 该函数最好应写为lambda表达式。

这是我做的:

//Inner class
public static class Bean implements Serializable {
    private static final long serialVersionUID = 1L;
    private String k;
    private int something;

    public Bean(String name, int value) {
        k = name;
        something = value;
    }

    public String getK() {return k;}
    public int getSomething() {return something;}

    public void setK(String k) {this.k = k;}
    public void setSomething(int something) {this.something = something;}
}

//usage
List<Bean> debugData = new ArrayList<Bean>();
debugData.add(new Bean("Arnold", 18));
debugData.add(new Bean("Bob", 7));
debugData.add(new Bean("Bob", 13));
debugData.add(new Bean("Bob", 15));
debugData.add(new Bean("Alice", 27));
Dataset<Row> df = sqlContext.createDataFrame(debugData, Bean.class);
df.groupByKey(row -> {new Bean(row.getString(0), row.getInt(1));}, Encoders.bean(Bean.class)); //doesn't compile

我得到的错误:

  1. 模糊方法调用 - IDE显示有关Function1和MapFunction匹配的警告。
  2. 无法解析getString和getInt
  3. 我无法显示/打印结果
提问于
用户回答回答于

使用Java 8 lambda

df.groupByKey(row -> {
            return new Bean(row.getString(0), row.getInt(1));
        }, Encoders.bean(Bean.class));

运用 MapFunction

df.groupByKey(new MapFunction<Row, Bean>() {
            @Override
            public Bean call(Row row) throws Exception {
                return new Bean(row.getString(0), row.getInt(1));
            }
        }, Encoders.bean(Bean.class));
用户回答回答于

出现此错误是因为groupByKey有两个过度的实现。其中一种方法给出了MapFunction第一个论点和第二个论点Function1. Your lambda code can cast to both of them. So you should explicitly declare which one is your intention. Casting is an easy solution:

df.groupByKey(row -> (MapFunction<Row, Bean>) new Bean(row.getString(0), row.getInt(1))
    , Encoders.bean(Bean.class));

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励