Разница между загрузкой CSV-файла в RDD и Dataframe в спарк - PullRequest
0 голосов
/ 29 ноября 2018

Я не уверен, задан ли этот конкретный вопрос ранее или нет.может быть возможным дубликатом, но я не смог найти прецедент, сохраняющий это.

Поскольку мы знаем, что мы можем загрузить CSV-файл непосредственно в dataframe, а также загрузить его в RDD и затем преобразовать этот RDDк фрейму данных позже.

RDD = sc.textFile("pathlocation")

мы можем применить некоторые карты, фильтры и другие операции к этому RDD и можем преобразовать его в фрейм данных.

Также мы можем создать фрейм данных, непосредственно читающий файл csv

Dataframe = spark.read.format("csv").schema(schema).option("header","false").load("pathlocation")

Мой вопрос заключается в том, какие могут быть случаи использования, когда нам сначала нужно загрузить файл с использованием RDD и преобразовать его в фрейм данных?

Я просто знаю, что textFile читает строку данныхлиния.Какие могут быть сценарии, когда нам нужно выбрать метод RDD вместо фрейма данных?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Фреймы данных / наборы данных предлагают значительное улучшение производительности по сравнению с RDD благодаря двум мощным функциям:

  1. Управление пользовательской памятью (также известное как Project Tungsten) Данные хранятся в автономном режиме.куча памяти в двоичном формате.Это экономит много памяти.Кроме того, нет необходимости в сборке мусора.Зная заранее схему данных и эффективно сохраняя ее в двоичном формате, можно избежать дорогостоящей сериализации Java.

  2. Оптимизированные планы выполнения (также известный как Catalyst Optimizer)
    Планы запросов создаются для выполнения с использованием оптимизатора катализатора Spark.После того, как оптимизированный план выполнения подготовлен, пройдя через несколько этапов, окончательное выполнение происходит только внутри СДР, но оно полностью скрыто от пользователей.

В общем, вы никогда не должны использовать СДР, если только выхотите самостоятельно выполнять низкоуровневые оптимизации / сериализации.

Реализация разделителя клиента в PySpark с RDD:

def partitionFunc(key):
import random
if key == 17850 or key == 12583:
return 0
else:
return random.randint(1,2)

# You can call the Partitioner as below:
keyedRDD = rdd.keyBy(lambda row: row[6])
keyedRDD\
.partitionBy(3, partitionFunc)\
.map(lambda x: x[0])\
.glom()\
.map(lambda x: len(set(x)))\
.take(5)
0 голосов
/ 29 ноября 2018

Преобразование RDD в DF в основном не рекомендуется, если нет API для прямой загрузки данных в виде Dataframe.

Это и это - это два блога, которые подробно отвечают на ваш вопрос.Цитируя из первого,

Когда использовать СДР?Рассмотрите эти сценарии или общие случаи использования RDD, когда:

требуется низкоуровневое преобразование и действия и контроль над набором данных;

ваши данные неструктурированы, например, медиапотоки или потокиtext;

вы хотите манипулировать вашими данными с помощью функциональных программных конструкций, а не выражений, специфичных для предметной области;

вам не нужно навязывать схему, такую ​​как столбчатый формат, при обработке или доступе к атрибутам данныхпо имени или столбцу;

, и вы можете отказаться от некоторых преимуществ оптимизации и производительности, доступных с DataFrames и Datasets для структурированных и полуструктурированных данных.

...