Сравнение производительности с take (10) и limit (10) .collect () - PullRequest
2 голосов
/ 07 октября 2019

У меня есть фрейм данных с миллиардом записей, и я хотел извлечь из него 10 записей.

Какой подход лучше и быстрее?

df.take(10) или df.limit(10).collect()?

Ответы [ 4 ]

4 голосов
/ 07 октября 2019

Оба метода приведут к одинаковой производительности, просто из-за того, что их реализация одинакова .

Из реализации Spark на github

def take(n: Int): Array[T] = head(n)

В то время как реализация головы такова:

def head(n: Int): Array[T] = withAction("head", limit(n).queryExecution)(collectFromPlan)

Как вы можете видеть, голова реализована в точности с помощью limit + collect.

Таким образом, ониЧтобы получить одинаковую производительность, разница, которую вы измерили, должна быть случайным отклонением, попробуйте запустить эксперимент много раз, чтобы преодолеть его.

1 голос
/ 07 октября 2019

Используйте дубль (10), он должен быть мгновенным.

myDataFrame.take(10) //Action
df.limit(10) //Transformation

Ссылка: искровой доступ к первым n строкам - принять против предела

1 голос
/ 07 октября 2019

Spark делает ленивую эволюцию. поэтому не имеет значения, какой API вы используете, оба будут давать одинаковый результат с одинаковой производительностью.

0 голосов
/ 07 октября 2019

В старых версиях Spark возникали проблемы с операцией limit, при которой считывался бы весь набор данных, с более новыми версиями, которые они разделяют аналогичная реализация, на что указывает @ Anton.P

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

Это поведение может быть улучшено в будущем, когда Data Source API v2 будет готов:

SPARK-15689

SPIP: API источника данных V2

...