Добавить одну строку из одного набора данных в другой набор данных в Spark Scala - PullRequest
0 голосов
/ 10 мая 2018

Существует два набора 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))

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

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

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

1 Ответ

0 голосов
/ 10 мая 2018

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

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 для первой строки теста

...