Java Spark: Как создать плоскую карту для набора данных и предоставить новую схему для последующего группирования?

#java #apache-spark #apache-spark-sql

Вопрос:

У меня есть следующий код:

 public static void main(String[] args) {
  Dataset<Row> myDataset = spark.read().parquet(PATH);

  Dataset<Row> groupedDataset = myDataset
      .flatMap((FlatMapFunction<Row, Row>) (row) -> flatMapFunc(row), Encoders.bean(Row.class))
      .groupBy("group_id")
      .max("max_col");
}  

private static Iterator<Row> flatMapFunc(Row row) {
  WrappedArray<Row> rowWrappedArray = (WrappedArray<Row>) row.get(16);
  return JavaConverters.asJavaIterator(rowWrappedArray.iterator());
}
 

Он выходит из строя при первом предложении groupBy. Причина в том , что после flatMap , то Dataset теряет свои имена столбцов (вызов columns() после flatMap возвращает пустое Array ) и, таким образом, группировка по имени столбца становится невозможной. Кроме того, max() вызов также не будет работать, потому "max_col" что это также несуществующее имя столбца.

Как я могу предоставить имена столбцов для файла, в Dataset котором уже есть данные, но нет имен столбцов (по сути, предоставляя схему для уже существующего Dataset )? Также приму любое другое решение, которое достигнет того, чего я хочу, — возможность группироваться по определенному столбцу и находить максимум в другом.