Создать образец значения для записей об ошибках - PullRequest
0 голосов
/ 01 октября 2018

У меня есть сценарий, в котором мой фрейм данных имеет 3 столбца a, b и c.Мне нужно проверить, если длина всех столбцов равна 100. На основе проверки я создаю столбец состояния, такой как a_status, b_status, c_status со значениями 5 (успех) и 10 (сбой).В сценариях сбоя мне нужно обновить счетчик и создать новые столбцы a_sample, b_sample, c_sample с некоторыми 5 значениями примера сбоя, разделенными ",".Для создания столбца примеров я пробовал вот так:

df= df.select(df.columns.toList.map(col(_)) ::: 
         df.columns.toList.map( x => (lit(getSample(df.select(x, x + "_status").filter(x + "_status=10" ).select(x).take(5))).alias(x + "_sample")) ).toList: _* )

Метод getSample просто получит массив строк и объединит их в строку.Это прекрасно работает для ограниченных столбцов и размера данных.Однако, если количество столбцов> 200 и данных> 1 миллиона строк, это оказывает огромное влияние на производительность.Есть ли альтернативный подход для того же.

1 Ответ

0 голосов
/ 20 октября 2018

Хотя детали вашей постановки проблемы неясны, вы можете разбить задачу на две части:

  1. Преобразовать данные в формат, в котором вы идентифицируете несколько различных типов строк, которые необходимо выбрать для выборки.
  2. Сбор выборки по типу строки.

Промышленный жаргон для "типа строки" - это страта / страты и способ выполнения (2), без сбора данных для драйвера, которыйВы не хотите делать, когда данные большие, через стратифицированную выборку, которую Spark реализует через df.stat.sampleBy().Как статистическая функция, она работает не с точными номерами строк, а с дробями.Если вам абсолютно необходимо получить выборку с точным числом строк, есть две стратегии:

  • Перебор выборки по фракции, а затем фильтрация ненужных строк, например, с помощью оконной функции row_number(), за которой следует фильтр 'row_num < n.
  • Создание пользовательской пользовательской статистической функции (UDAF), firstN(col, n).Это будет намного быстрее, но намного больше работы.См. https://docs.databricks.com/spark/latest/spark-sql/udaf-scala.html

Дополнительной проблемой для вашего варианта использования является то, что вы хотите, чтобы это было сделано для каждого столбца.Это не очень подходит для преобразований Spark, таких как группировка или sampleBy, которые работают со строками.Простой подход состоит в том, чтобы сделать несколько проходов через данные, по одному столбцу за раз.Если вам абсолютно необходимо сделать это за один проход данных, вам нужно будет создать гораздо более настраиваемый UDAF или Aggregator, например, эквивалент takeFirstNFromAWhereBHasValueC(n, colA, colB, c).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...