pyspark наиболее эффективное сопоставление даты и времени - PullRequest
0 голосов
/ 08 июня 2018

У меня есть фрейм данных PySpark (2.3.0) со столбцом типа отметки времени:

>> df.show()
+-------------------+
|            column |
+-------------------+
|2004-02-16 12:01:37|
|2004-02-23 10:28:49|
|2004-02-23 12:49:14|
|2004-02-26 12:29:58|
|2004-03-02 10:10:28|
|2004-03-03 03:40:13|
|2004-03-16 05:00:10|
|2004-03-16 03:28:21|
|2004-03-17 02:45:22|
|2004-03-23 08:14:47|
+-------------------+
>> df.printSchema()
root
|-- column: timestamp (nullable = true)

Я хочу отфильтровать этот фрейм данных, чтобы найти записи на определенную дату:

import datetime
date = datetime.datetime.strptime('2018-06-07', '%Y-%m-%d').date()
* 1006Какой метод фильтрации наиболее эффективен? Примечание : данные считываются через JDBC, поэтому они могут не распространяться.

Вот что я пробовал (не заметил существенных различий), что предпочтительнее?Я что-нибудь пропустил?

Способ 1: приведение к дате

df.filter(psf.col('column').cast('date') == date)

Способ 2: совпадение по году, месяцу, дню месяца

import pyspark.sql.functions as psf
(
  df
  .filter(psf.dayofmonth('column') == date.day)
  .filter(psf.month('column') == date.month)
  .filter(psf.year('column') == date.year)
)

1 Ответ

0 голосов
/ 08 июня 2018

Вот что я пробовал (не заметил серьезных отличий), что предпочтительнее?

Ни того, ни другого.Оба метода неэффективны и не могут полностью использовать возможности базы данных и Spark.Поскольку column кажется datetime или эквивалентным, а для запроса требуется casting, Spark не может использовать предикат push-down, и фильтрация применяется на стороне кластера, поэтому производительность будет аналогичной (давать или брать издержки для нескольких вызовов функций).

Для повышения производительности вы можете переопределить запрос следующим образом (плюс другие параметры, которые вы обычно используете):

df = spark.read.jdbc(
    url,
    "(SELECT CAST(column AS date) date, * FROM table) AS tmp",
    ...
)

, а затем:

df.filter(psf.col('date') == date)

Если вы этого не сделаетеДля планирования процесса чтения или использования динамических запросов вы также можете использовать predicates:

spark.read.jdbc(
    ...,
    predicates=["CAST(column AS date) = '{}'".format(date)])
)

или встраивать выбор в определение таблицы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...