машинное обучение
December 8, 2022

5 способов просмотра содержимого Spark датафрейма

Некоторые предпочитают видеть уродство этого мира. Я хочу видеть красоту. Рассмотрим основные способы ознакомления с содержанием spark датафрейма. Пусть мы работаем со следующим набором:

sdf = spark.createDataFrame([(1, '20200101 03:23:12', 'qqqqqqqqqeeeeeeeeeetttttt'), 
                             (2, '20201211 11:12:33', 'ssssssss'), 
                             (4, '20201221 23:23:02', 'aaaaaaa'),
                             (3, '20201121 23:23:02', 'ddddddd')], schema=['id', 'dt', 'text'])

Чтобы просмотреть n строк датафрейма можете воспользоваться методами limit или take:

sdf.take(2)
sdf.limit(3)

Отличия - take возвращает список объектов типа row, а limit не гарантирует возврат именно первых n строк.

Аналогичную функцию, но с большими возможностями предлагает метод show. Помимо количества первых n строк датафрейма для вывода ей можно задать опцию не обрезать (truncate=False) длинные значения в ячейках (свыше 20 символов) или указать форму вывода в привычном виде (таблица) или вертикальном - каждая запись отображается вертикально (vertical=True):

sdf.show(2)

А так получите строки без обрезания ячеек и в вертикальном формате:

sdf.show(2, truncate=False, vertical=True)

С методом sample получим случайную выборку строк. Их ожидаемая доля задается через параметр fraction, опция возможности возвращения элемента - withReplacement, инициализатор случайных значений - seed. При этом fraction не обязан совпадать с долей элементов, которая будет возвращена, так как значение определяет вероятность получения каждой строки:

sdf.sample(withReplacement=False, fraction=3/sdf.count(), seed=21)

Collect возвращает список из объектов типа Row, соответствующих всем строкам датафрейма. Будьте осторожны, так как данная операция может вызвать нехватку памяти на драйвере.

Со списком объектов Row удобно работать, когда хотите вернуть конкретное значение в ячейке:

import pyspark.sql.functions as F

sdf.filter(F.col('id')==1).collect()[0].text