Dataframe в Apache PySpark: подробное руководство [с примерами]
Опубликовано: 2020-02-27Сегодня мы узнаем о DataFrame в Apache PySpark . Pyspark — один из лучших инструментов для обработки данных в 2020 году. Он называется столбцом распределенной коллекции строк в Apache Spark. Это очень похоже на таблицы или столбцы в таблицах Excel, а также на таблицу реляционной базы данных. PySpark DataFrame также имеет схожие характеристики RDD, а именно:
Распределенный: природа DataFrame и RDD распределена.
Ленивые оценки: выполнение задачи не выполняется, если действие не выполняется
Природа неизменяемости: Еще одна похожая характеристика RDD/DataFrame заключается в том, что ее нельзя изменить после ее создания. Но можно применить преобразование для преобразования RDD/DataFrame.
Оглавление
Преимущество фреймов данных
1. Это поддерживает множество различных языков, таких как Java, Scala, R, Python, что полезно с точки зрения поддержки API. Поддержка нескольких языков API помогает в работе со многими языками программирования.
2. DataFrame поддерживает широкий спектр источников данных и форматов, что очень помогает удобно использовать различные источники данных и их формат.
3. Одна из лучших особенностей DataFrame заключается в том, что он может обрабатывать даже петабайты данных, что является замечательной способностью обрабатывать такие огромные данные.
4. Apache Spark быстро понимает схему DataFrame с наблюдением в Spark DataFrame. В именованных столбцах организовано наблюдение Spark DataFrame. Таким образом оптимизируется план выполнения запросов.
5. Огромный объем частично структурированных и структурированных данных может быть быстро обработан, поскольку он предназначен для обработки кадров данных.
Настройка Apache Spark
Apache Spark должен быть настроен на компьютере, прежде чем его можно будет использовать для операций DataFrame. С данными можно работать при поддержке DataFrame, поскольку он поддерживает различные операции DataFrame. Здесь мы собираемся обсудить некоторые общие операции DataFrame.
Создание SparkContext — это первый шаг в программировании Apache. Для выполнения операций в кластере требуется SparkContext. Как получить доступ к кластеру подсказывает SparkContext. Он также показывает Spark о местоположении для получения кластера.
Читайте: Фреймворки глубокого обучения
Затем устанавливается соединение Apache Cluster. Его создание уже сделано, если вы используете Spark Shell. С другой стороны, параметр конфигурации может быть предоставлен, инициализирован и импортирован для создания SparkContext.
Можно использовать этот код для создания:
из pyspark импортировать SparkContext
sc = SparkContext()
Создание DataFrame из файла CSV
В оболочке python необходимо указать новую библиотеку, чтобы файл CSV можно было прочитать. Для этого первым шагом является загрузка последней версии пакета Spark-CSV и извлечение пакета в домашнем каталоге Spark. После этого мы откроем оболочку PySpark, и пакет должен быть включен.
$ ./bin/pyspark – пакеты com.databricks:spark-csv_2.10:1.3.0
Теперь DataFrame будет создан после того, как данные будут прочитаны из файла CSV.
поезд = sqlContext.load (источник = «com.databricks.spark.csv», путь = «ПУТЬ/поезд.csv», заголовок = True, inferSchema = True)
test = sqlContext.load (источник = «com.databricks.spark.csv», path = «PATH/test-comb.csv», header = True, inferSchema = True)
Тестовые CSV-файлы и обучающие CSV-файлы находятся в папке с именем PATH. Если заголовок есть в файле CSV, он будет отображаться как True. Чтобы узнать тип данных в каждом столбце фрейма данных, мы будем использовать опцию inferSchema = True. При использовании параметра inferSchema = True обнаружение типа данных каждого столбца фрейма данных будет автоматически определяться контекстом SQL. Все столбцы будут считаны как строка, если мы не установим для inferSchema значение true.
Читайте: Библиотеки Python для машинного обучения
Манипуляции с DataFrame
Теперь здесь мы увидим, как манипулировать фреймом данных:
- Знайте тип данных столбцов
printSchema будет использоваться для просмотра типа столбца и его типа данных. Теперь схема будет напечатана в формате дерева с помощью функции printSchema().
поезд.printSchema()
Выход:
корень
|– User_ID: целое число (можно обнулить = true)
|– Product_ID: строка (можно обнулить = истина)
|– Пол: строка (nullable = true)
|– Возраст: строка (можно обнулить = истина)
|– Занятость: целое число (можно обнулить = правда)
|– City_Category: строка (можно обнулить = истина)
|– Stay_In_Current_City_Years: строка (можно обнулить = истина)
|– Marital_Status: целое число (можно обнулить = true)
|– Product_Category_1: целое число (можно обнулить = true)
|– Product_Category_2: целое число (можно обнулить = true)
|– Product_Category_3: целое число (можно обнулить = true)
|– Покупка: целое число (nullable = true)
После чтения файла csv мы видим, что мы точно получили тип данных или схему каждого столбца во фрейме данных.
- Показаны первые n наблюдений
Чтобы увидеть первое n наблюдение, можно использовать операцию головы. Головная операция Pandas такая же, как и головная операция PySpark.
поезд.голова(5)
Выход:
[Строка (User_ID = 1000001, Product_ID = u'P00069042', Пол = u'F', Возраст = u'0-17', Род занятий = 10, City_Category = u'A', Stay_In_Current_City_Years = u'2', Семейное_статус = 0, Product_Category_1=3, Product_Category_2=Нет, Product_Category_3=Нет, Покупка=8370),
Строка (User_ID = 1000001, Product_ID = u'P00248942', Пол = u'F', Возраст = u'0-17', Род занятий = 10, City_Category = u'A', Stay_In_Current_City_Years = u'2', Семейное положение = 0 , Product_Category_1=1, Product_Category_2=6, Product_Category_3=14, Purchase=15200),
Строка (User_ID = 1000001, Product_ID = u'P00087842', Пол = u'F', Возраст = u'0-17', Род занятий = 10, City_Category = u'A', Stay_In_Current_City_Years = u'2', Семейное положение = 0 , Product_Category_1=12, Product_Category_2=Нет, Product_Category_3=Нет, Покупка=1422),
Строка (User_ID = 1000001, Product_ID = u'P00085442', Пол = u'F', Возраст = u'0-17', Род занятий = 10, City_Category = u'A', Stay_In_Current_City_Years = u'2', Семейное положение = 0 , Product_Category_1=12, Product_Category_2=14, Product_Category_3=Нет, Покупка=1057),
Строка (User_ID = 1000002, Product_ID = u'P00285442', Пол = u'M', Возраст = u'55+', Род занятий = 16, City_Category = u'C', Stay_In_Current_City_Years = u'4+', Семейное положение = 0 , Product_Category_1=8, Product_Category_2=Нет, Product_Category_3=Нет, Покупка=7969)]
Теперь мы воспользуемся операцией show, чтобы лучше увидеть результат, потому что результаты будут представлены в формате строки. Мы также можем обрезать результат, используя аргумент truncate = True.
train.show(2,truncate=Истина)
Выход:
+——-+———-+——+—-+———-+————-+—————————+—————+——————+ ——————+——————+———+
|User_ID|Product_ID|Пол| Возраст|Род занятий|City_Category|Проживание_В_Текущем_City_Years|Семейное_Положение|Product_Category_1|Product_Category_2|Product_Category_3|Покупка|
+——-+———-+——+—-+———-+————-+—————————+—————+——————+ ——————+——————+———+
|1000001| P00069042| Ф|0-17| 10| А| 2| 0| 3| ноль | ноль | 8370|
|1000001| P00248942| Ф|0-17| 10| А| 2| 0| 1| 6| 14| 15200|
+——-+———-+——+—-+———-+————-+—————————+—————+——————+ ——————+——————+———+
показаны только верхние 2 строки
- Подсчет количества строк DataFrame
Чтобы подсчитать количество строк во фрейме данных, мы можем использовать операцию подсчета. Теперь мы подсчитаем количество строк тестовых файлов и обучающих файлов, применив операцию подсчета.
поезд.счет(), тест.счет()
Выход:
(233598, 550069)
У нас есть 233598, 550069 строк в тесте и поезде соответственно.
- Получение количества столбцов и имени столбцов из файла теста и обучения
Подобно работе столбца в DataFrame панд, мы будем использовать операцию столбца, чтобы получить имя столбца. Теперь сначала мы напечатаем нет. столбца и имя столбца из тестового файла и файла поезда.
len(поезд.столбцы), поезд.столбцы
Выход:
12 ['User_ID', 'Product_ID', 'Пол', 'Возраст', 'Профессия', 'City_Category', 'Stay_In_City_Years', 'Семейное положение', 'Product_Category_1', 'Product_Category_2', 'Product_Category_3', 'Покупка']
Теперь аналогично делаем это для тестового файла.
len(тест.столбцы), тест.столбцы
Выход:
13 [», 'User_ID', 'Product_ID', 'Пол', 'Возраст', 'Профессия', 'City_Category', 'Stay_In_City_City_Years', 'Семейное_статус', 'Product_Category_1', 'Product_Category_2', 'Product_Category_3', 'Comb ']
После приведенного выше вывода мы видим, что в обучающем файле 12 столбцов, а в тестовом файле — 13 столбцов. Из приведенного выше вывода мы можем убедиться, что у нас есть 13 столбцов в тестовом файле и 12 в обучающем файле. Столбец «Расческа» — единственный столбец в тестовом файле, и в тестовом файле нет столбца «Покупка». В тестовом файле есть еще один столбец, который, как мы видим, не имеет имени столбца.
- Получение сводной статистики, такой как количество, максимум, минимум, стандартное отклонение, среднее значение в числовых столбцах DataFrame.
В DataFrame мы будем использовать операцию, называемую описать операцию. Мы можем выполнить расчет числового столбца и получить статистическую сводку, используя описание операции. Все числовые столбцы будут рассчитываться в DataFrame, у нас нет имени столбца, указанного при расчете сводной статистики.
поезд.описать().показать()
Выход:
+——-+——————+—————+——————-+——————+——————+——————+—— ————+
|резюме| User_ID| Род занятий| Семейное_статус|Категория_продукта_1|Категория_продукта_2|Категория_продукта_3| Покупка|
+——-+——————+—————+——————-+——————+——————+——————+—— ————+
| количество | 550068| 550068| 550068| 550068| 376430| 166821| 550068|

| среднее|1003028,8424013031|8,076706879876669|0,40965298835780306| 5.404270017525106| 9,842329251122386|12,668243206790512| 9263.968712959126|
| станддев|1727.5915855308265|6.522660487341778| 0,4917701263173273|3,9362113692014082| 5.086589648693526| 4.125337631575267|5023.0653938206015|
| мин| 1000001| 0| 0| 1| 2| 3| 12|
| макс | 1006040| 20| 1| 20| 18| 18| 23961|
+——-+——————+—————+——————-+——————+——————+——————+—— ————+
В операции описания это то, что мы получаем, когда указано имя столбца строки или имя столбца категории.
train.describe('Product_ID').show()
Выход:
+——-+———-+
|резюме|ID_продукта|
+——-+———-+
| количество | 550068|
| означает | ноль |
| стандартное отклонение | ноль |
| мин| P00000142|
| макс | P0099942|
+——-+———-+
На основе ASCII рассчитаны максимальное и минимальное значения. Операция описания используется для работы со столбцом типа String.
- Выбор столбца DataFrame
Мы будем использовать имя столбца в операции выбора, чтобы выбрать столбец. Мы будем упоминать имя столбца с разделением с помощью запятых. Теперь посмотрим, как производится выбор «Возраст» и «Идентификатор_пользователя» из обучающего файла.
- train.select('User_ID','Возраст').show(5)
- Выход:
- +——-+—-+
- |Идентификатор_пользователя| Возраст|
- +——-+—-+
- |1000001|0-17|
- |1000001|0-17|
- |1000001|0-17|
- |1000001|0-17|
- |1000002| 55+|
- +——-+—-+
- Обнаружение отличительного номера продукта. в тестовых файлах и файлах обучения
Чтобы вычислить номер DataFrame. различных строк, мы будем использовать отдельную операцию. Теперь здесь мы собираемся применить отдельную операцию для вычисления числа нет. отдельного продукта в тестовом и обучающем файлах.
train.select('Product_ID').distinct().count(),test.select('Product_ID').distinct().count()
Выход:
(3633, 3492)
У нас есть 3492 и 3633 различных продукта в тестовом и обучающем файлах соответственно. Теперь мы знаем, что в обучающем файле у нас больше различных значений, чем в тестовом файле, о чем мы можем узнать из выходного результата. Теперь мы будем использовать операцию вычитания, чтобы узнать категории Product_ID, которые отсутствуют в обучающем файле, но присутствуют в тестовом файле. То же самое можно сделать и для всех признаков категориального.
diff_cat_in_train_test=test.select('Product_ID').subtract(train.select('Product_ID'))
diff_cat_in_train_test.distinct().count()# Для подсчета различных
Выход:
46
Таким образом, из приведенного выше результата мы можем узнать, что существует 47 различных категорий, которых нет в тренировочном файле, но они присутствуют в тестовом файле. Данные будут пропущены или взяты из тестового файла, которого нет в файле поезда.
- Расчет попарной частоты категориальных столбцов?
Давайте выполним расчет попарной частоты столбца в DataFrame с помощью операции can crosstab. Теперь давайте вычислим столбцы «Пол» и «Возраст» в DataFrame поезда, применив операцию кросс -таблицы.
train.crosstab('Возраст', 'Пол').show()
Выход:
+———-+——+——+
|Возраст_Пол| Ф| М|
+———-+——+——+
| 0-17| 5083| 10019|
| 46-50|13199| 32502|
| 18-25|24628| 75032|
| 36-45|27170| 82843|
| 55+| 5083| 16421|
| 51-55| 9894| 28607|
| 26-35|50752|168835|
+———-+——+——+
Отличительное значение Пола — это имя столбца, а другое значение Возраста — имя строки, что можно увидеть в приведенном выше результате. В таблице количество пары будет равно нулю, если оно не возникло.
Как получить DataFrame с уникальными строками?
Чтобы найти уникальные строки и не включать повторяющиеся строки, мы будем использовать операцию dropDuplicates . Он получит Dataframe без повторяющихся строк, удалив повторяющиеся строки DataFrame. Пожалуйста, проверьте здесь, чтобы узнать, как выполняется процедура dropDuplicates для получения всех уникальных строк для столбцов.
train.select('Возраст','Пол').dropDuplicates().show()
Выход:
+——+——+
| Возраст|Пол|
+——+——+
|51-55| Ф|
|51-55| М|
|26-35| Ф|
|26-35| М|
|36-45| Ф|
|36-45| М|
|46-50| Ф|
|46-50| М|
| 55+| Ф|
| 55+| М|
|18-25| Ф|
| 0-17| Ф|
|18-25| М|
| 0-17| М|
+——+——+
- Как удалить строки с нулевым значением?
Если кто-то хочет удалить все строки, которые имеют нулевое значение, мы можем использовать операцию, называемую операцией dropna . Чтобы удалить строку из DataFrame, он рассматривает три варианта.
- Подмножество — это список всех имен столбцов, которые необходимо учитывать при операции удаления столбца с нулевыми значениями.
- Thresh — это помогает отбрасывать строки с ненулевыми значениями меньше порогового значения. По умолчанию здесь ничего не указано.
- Как – может быть использован в двух видах – все или любой. При использовании any строка будет удалена, если какое-либо значение в строке равно null. Используя все, он уменьшит строку, если все значения строк равны нулю.
Теперь здесь мы собираемся использовать все эти параметры один за другим, чтобы удалить строки, которые являются нулевыми, используя параметры по умолчанию, такие как подмножество, thresh, None для того, как, none, any.
поезд.dropna().count()
Выход:
166821
- Как заполнить нулевые значения DataFrame постоянным номером?
Чтобы заполнить нулевые значения константой no. Здесь мы будем использовать операцию fillna . Есть два параметра, которые должны учитываться операцией fillna для заполнения нулевых значений.
- подмножество: здесь нужно указать столбцы, которые следует учитывать при заполнении значений.
- значение: здесь мы можем указать количество, которое нужно заменить каким значением, которое может быть любым типом данных, таким как строка, число с плавающей запятой, целое число во всех столбцах.
Здесь мы собираемся заполнить «-1» вместо нулевых значений в кадре данных поезда.
train.fillna(-1).show(2)
Выход:
+——-+———-+——+—-+———-+————-+—————————+—————+——————+ ——————+——————+———+
|User_ID|Product_ID|Пол| Возраст|Род занятий|City_Category|Проживание_В_Текущем_City_Years|Семейное_Положение|Product_Category_1|Product_Category_2|Product_Category_3|Покупка|
+——-+———-+——+—-+———-+————-+—————————+—————+——————+ ——————+——————+———+
|1000001| P00069042| Ф|0-17| 10| А| 2| 0| 3| -1| -1| 8370|
|1000001| P00248942| Ф|0-17| 10| А| 2| 0| 1| 6| 14| 15200|
+——-+———-+——+—-+———-+————-+—————————+—————+——————+ ——————+——————+———+
показаны только верхние 2 строки
Заключение
PySpark набирает обороты в мире искусственного интеллекта и машинного обучения. PySpark используется для решения реальных задач машинного обучения. Вы можете создавать RDD из разных источников данных, как внешних, так и существующих, и выполнять с ним все типы преобразований. Надеюсь, эта статья была информативной и смогла дать вам глубокое понимание фреймов данных PySpark.
Если вам интересно узнать о PySpark и других инструментах для обработки данных, ознакомьтесь с дипломом PG IIIT-B и upGrad по науке о данных, который создан для работающих профессионалов и предлагает более 10 тематических исследований и проектов, практические семинары, наставничество с отраслевых экспертов, один на один с отраслевыми наставниками, более 400 часов обучения и помощи в трудоустройстве в ведущих фирмах.
Является ли PySpark более эффективным, чем Pandas?
Да, PySpark быстрее, чем Pandas, и даже превосходит Pandas в сравнительном тесте. Проще говоря, Pandas выполняет операции на одной машине, тогда как PySpark выполняет операции на нескольких машинах. Если вы работаете над приложением машинного обучения с огромным набором данных, PySpark — идеальный вариант, поскольку он может выполнять операции в 100 раз быстрее, чем Pandas. Благодаря JVM язык программирования Scala в 10 раз быстрее Python для анализа и обработки данных. Когда программный код Python используется для вызовов библиотек Spark, результаты получаются посредственными.
Каковы недостатки использования Apache PySpark?
У Spark нет собственной системы управления файлами. Из-за высокой стоимости дополнительной памяти, необходимой для работы Spark, вычисления в памяти могут быть чрезмерно дорогостоящими. При использовании Apache Spark с Hadoop разработчики сталкиваются с трудностями при работе с компактными файлами. Данные в Spark повторяются пакетами, при этом каждая итерация планируется и обрабатывается независимо. В Apache Spark данные разбиваются на более мелкие пакеты с заданным интервалом времени. В результате критерии окна на основе записей не будут поддерживаться Apache. Вместо этого он предоставляет критерии окна на основе времени.
Чем наборы данных, DataFrame и RDD отличаются друг от друга?
RDD — это кластерный набор элементов данных, распределенных по нескольким компьютерам. Данные представлены через RDD, которые представляют собой набор объектов Java или Scala. DataFrame — это набор данных, структурированных в именованные столбцы, которые распределены по множеству серверов. В реляционной базе данных это концептуально эквивалентно таблице. Набор данных — это расширение API фрейма данных, которое предлагает безопасный для типов объектно-ориентированный программный интерфейс RDD API. DataFrame — это распределенная коллекция данных, похожая на RDD, которая не может быть изменена. Данные структурированы в именованные столбцы, подобно таблице в реляционной базе данных, а не RDD. Когда дело доходит до простых задач, таких как группировка данных, RDD медленнее, чем кадры данных и наборы данных. Он имеет простой API для выполнения агрегатных задач. Он может агрегировать данные быстрее, чем RDD и наборы данных.