В настоящее время я работаю над проектом, в котором я читаю 19 различных файлов паркета и присоединяюсь к ID.У некоторых из этих файлов есть несколько строк для каждого потребителя, у некоторых их нет.
У меня есть файл ключа, в котором есть 1 столбец, к которому я присоединяюсь, и другой (userName), который мне нужен, и мне нужны все столбцыдругие файлы.
Я создаю отдельную программу чтения для каждого файла паркета, которая читает файл и преобразует его в набор искровых данных со структурой, подобной этой:
GenericStructure1 record;
int id;
Затем я присоединяюсь ко всем этимсозданные наборы данных (представьте себе все 19):
keyDataset.join(dataSet1, dataSet1.col("id").equalTo(keyDataset.col("id")), "left_outer")
.join(dataSet19, dataSet19.col("id").equalTo(keyDataset.col("id")), "left_outer")
.groupBy(keyDataset.col("id"), keyDataset.col("userName"))
.agg(
collect_set(dataSet1.col("record")).as("set1"),
collect_set(dataSet19.col("record")).as("set19")
.select(
keyDataset.col("id"),
keyDataset.col("userName"),
col("set1"),
col("set19")
)
.as(Encoders.bean(Set.class));
, где Set.class выглядит примерно так:
public class Set implements Serializable {
long id;
String userName;
List<GenericStructure1> set1;
List<GenericStructure19> set19;
}
Это прекрасно работает для 100 записей, но когда я пытаюсь увеличитьдо одной части 5-миллиметрового файла паркета (что-то вроде 75K записей), он взбивает и прожигает память до тех пор, пока, в конце концов, не иссякнет.В производстве мне нужно, чтобы это работало на миллионах, поэтому факт, что он задыхается на 75K, является реальной проблемой.Единственное, я не вижу простого способа оптимизировать его, чтобы он мог справиться с такой нагрузкой.Кто-нибудь знает недорогой способ объединения большого количества данных, как показано выше?