Добавить одну строку из одного набора данных в другой набор данных в Spark Scala

Существует два набора DataFrame: один - «обучающий набор», другой - «тестовый набор». Я хочу выполнить итерацию некоторого алгоритма (назовем AAA, для которого требуется входной формат RDD), используя «Учебный набор плюс только одна строка тестового набора», следуя шагу ниже.

  1. Объединить весь тренировочный набор + «первую» строку тестового набора.
  2. Запуск некоторого алгоритма с использованием данных 1 и получение результата.
  3. Объединить весь обучающий набор + «вторую» строку тестового набора.
  4. Запуск некоторого алгоритма с использованием данных 2 и получение результата.
  5. Объединить весь обучающий набор + «третий» ряд тестового набора. … Итерация до последней строки набора тестов.

На самом деле, в руководстве по искрам я проверил, что RDD и DataFrame в искре неизменяемы, поэтому было невозможно использовать

Testset.map( x => AAA(Trainset.union(x)) )

Кроме того, я попытался использовать

Testset.map( x => AAA(Trainset.union(Array(x.get(0).toString.toDouble, x.get(1).toString.toDouble, ... x.get(19).toString.toDouble))

но это не сработало :(. Есть ли какое-либо решение, чтобы сделать возможным вышеупомянутый шаг? Если у вас есть хорошая идея для этой проблемы, пожалуйста, помогите мне.

// Изменить и добавить условие

Из-за трудоемкой проблемы мне нужно использовать параллельные вычисления. Поэтому я не мог использовать цикл for. Спасибо.


person Cheolwon_Jang    schedule 10.05.2018    source источник
comment
Я считаю, что вам нужна операция fold, а не map. Однако тот факт, что и Testset, и Trainset являются DataFrames, означает, что это не сработает, afaik, поскольку вы столкнетесь с проблемами сериализации.   -  person hoyland    schedule 10.05.2018
comment
вы можете преобразовать оба фрейма данных в rdd и использовать цикл for в тестовых данных и выполнить вычисления. просто. но помните, что ваша логика не подходит для распределенных / параллельных вычислений   -  person Ramesh Maharjan    schedule 10.05.2018


Ответы (1)


Не уверен, насколько это хорошая идея, но как насчет:

1) Создайте новый столбец в обучающем фрейме данных с именем helper со значением -1.

2) Создайте новый столбец в тестовом фрейме данных с именем helper следующим образом:

test.withColumn("helper", monotonically_increasing_id())

3) Запишите вывод 2) на диск, чтобы идентификаторы никогда не менялись

4) Объединение 1) с 3) обратным чтением, а затем кешированием / сохранением / записью на диск и обратным чтением

5) Напишите цикл, который фильтрует объединенный фрейм данных и выполняет логику:

val data = unioned.filter($"helper" === lit(-1) || $"helper" === lit(n))
val result = logic(data)

где n - это значение, которое вы перебираете, начиная с 0 для первой строки теста

person user2682459    schedule 10.05.2018