Хотя детали вашей постановки проблемы неясны, вы можете разбить задачу на две части:
- Преобразовать данные в формат, в котором вы идентифицируете несколько различных типов строк, которые необходимо выбрать для выборки.
- Сбор выборки по типу строки.
Промышленный жаргон для "типа строки" - это страта / страты и способ выполнения (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)
.