Map<File, Dataset<Row> allWords = ...
StructField[] structFields = new StructField[] {
new StructField("word", DataTypes.StringType, false, Metadata.empty()),
new StructField("count", DataTypes.IntegerType, false, Metadata.empty()),
new StructField("files", ???, false, Metadata.empty())
};
StructType structType = new StructType(structFields);
Dataset<Row> allFilesWords = spark.createDataFrame(new ArrayList<>(), structType);
for (Map.Entry<File, Dataset<Row>> entry : allWords.entrySet()) {
Integer fileIndex = files.indexOf(entry.getKey());
allFilesWords.unionAll(
allWords.get(entry.getKey()).withColumn("files", ???)
);
}
В приведенном выше коде allWords
представляет сопоставление файла с количеством слов (Row: (string, integer)
). Теперь я хочу объединить результат для всех файлов в один DataFrame, сохранив исходный файл, в котором было упомянуто слово. Так как в конце каждое слово могло быть упомянуто в нескольких файлах, столбец files
имеет тип набор целых чисел (при условии, что файлы отображаются в целые числа). Теперь я пытаюсь добавить новый столбец в allWords
фреймы данных, а затем использовать unionAll
, чтобы объединить их все вместе.
Но я не знаю, как определить и инициализировать новый столбец (здесь он называется files
) с набором, содержащим только один элемент fileIndex
.
Благодаря ссылке, приведенной в комментариях, я знаю, что должен использовать functions.typedLit
, но эта функция запрашивает второй параметр, который я не знаю, что для него предоставить. Кроме того, я не знаю, как определить столбец. И последнее, предоставленная ссылка на Python, и я ищу Java API.