Java Spark:GroupBy上的堆栈溢出错误

时间:2018-08-03 07:26:47

标签: java apache-spark apache-spark-sql

我正在将Spark 2.3.1与Java配合使用。

我有一个数据集,我想对其进行分组以进行一些聚合(例如本示例中的count())。必须根据给定的列列表进行分组。

我的功能如下:

public Dataset<Row> compute(Dataset<Row> data, List<String> columns){

    final List<Column> columns_col = new ArrayList<Column>();

    for (final String tag : columns) {
        columns_col.add(new Column(tag));
    }

    Seq<Column> columns_seq = JavaConverters.asScalaIteratorConverter(columns_col.iterator()).asScala().toSeq();

    System.out.println("My columns : "+columns_seq.mkString(", "));
    System.out.println("Data count : "+data.count());

    final Dataset<Row> dataset_count = data.groupBy(columns_seq).agg(count(col("value")));

    System.out.println("Result count : "+dataset_count.count()); 

    return dataset_count;
}       

当我这样称呼它时:

Dataset<Row> df = compute(MyDataset, Arrays.asList("field1","field2","field3","field4"));

dataset_count.count()上有一个StackOverflowError:

My columns : field1, field2, field3, field4
Data count : 136821
Exception in thread "main" java.lang.StackOverflowError
    at scala.collection.immutable.Stream$$anonfun$map$1.apply(Stream.scala:418)
    at scala.collection.immutable.Stream$Cons.tail(Stream.scala:1233)
    at scala.collection.immutable.Stream$Cons.tail(Stream.scala:1223)
    at scala.collection.immutable.Stream.drop(Stream.scala:858)
    at scala.collection.immutable.Stream.drop(Stream.scala:202)
    at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:64)
    at scala.collection.immutable.Stream.apply(Stream.scala:202)
    ...

但是如果我在函数中替换行

final Dataset<Row> dataset_count = data.groupBy(columns_seq).agg(count(col("value")));

通过

final Dataset<Row> dataset_count = data.groupBy("field1","field2","field3","field4").agg(count(col("value")));

我没有错误,并且我的程序计算良好:

My columns : field1, field2, field3, field4
Data count : 136821
Result count : 74698

此问题可能来自何处,是否有解决方案,可以根据未知列的列表对数据集进行分组?

2 个答案:

答案 0 :(得分:1)

尝试改用它:

Seq<Column> columns_seq = JavaConversions.asScalaBuffer(columns_col).seq();

答案 1 :(得分:0)

替换

DecimalFormat df2 = new DecimalFormat(".##");
df2.format(variable)

针对:

JavaConverters.asScalaIteratorConverter(columns_col.iterator()).asScala().toSeq();

为我完成了工作(经过充分测试)。