Spark Datasets groupByKey 不起作用 (Java)



我尝试使用数据集的groupbykey方法。我无法弄清楚这个问题,找不到使用groupbykey

的任何工作示例

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

  1. 我想使用groupbykey-有很多示例使用groupby("键")。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显示有关功能1和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。您的Lambda代码可以向他们两个。因此,您应该明确声明您的意图是哪一个。铸造是一个简单的解决方案:

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

相关内容

  • 没有找到相关文章

最新更新