web-dev-qa-db-ja.com

pysparkの「between」関数:タイムスタンプの範囲検索は包括的ではありません

pysparkの「between」関数は、タイムスタンプ入力には含まれません。

たとえば、 '2017-04-13'と '2017-04-14'のような2つの日付の間のすべての行が必要な場合、日付が文字列として渡されたときに「排他的」検索を実行します。つまり、「2017-04-14 00:00:00」フィールドが省略されます

しかし、ドキュメントはそれが 包括的 であることを示唆しているようです(タイムスタンプに関する参照はありません)。

もちろん、1つの方法は、上限からマイクロ秒を追加し、それを関数に渡すことです。ただし、大きな修正ではありません。包括的な検索を行うためのきれいな方法はありますか?

例:

import pandas as pd
from pyspark.sql import functions as F
... sql_context creation ...
test_pd=pd.DataFrame([{"start":'2017-04-13 12:00:00', "value":1.0},{"start":'2017-04-14 00:00:00', "value":1.1}])
test_df = sql_context.createDataFrame(test_pd).withColumn("start", F.col("start").cast('timestamp'))
test_df.show()

+--------------------+-----+
|               start|value|
+--------------------+-----+
|2017-04-13 12:00:...|  1.0|
|2017-04-14 00:00:...|  1.1|
+--------------------+-----+

test_df.filter(F.col("start").between('2017-04-13','2017-04-14')).show()

+--------------------+-----+
|               start|value|
+--------------------+-----+
|2017-04-13 12:00:...|  1.0|
+--------------------+-----+
10
Vinay Kolar

答えを見つけた。 pysparkの「between」関数は、タイムスタンプ入力の処理に一貫性がありません。

  1. 時間のない文字列形式で入力を提供すると、排他的な検索が実行されます(上記のリンクからドキュメントに期待されるものではありません)。
  2. 入力を日時オブジェクトとして、または正確な時刻(例: '2017-04-14 00:00:00')で提供すると、包括的な検索が実行されます。

上記の例の場合、以下は排他検索の出力です(pd.to_datetimeを使用)。

test_df.filter(F.col("start").between(pd.to_datetime('2017-04-13'),pd.to_datetime('2017-04-14'))).show()

+--------------------+-----+
|               start|value|
+--------------------+-----+
|2017-04-13 12:00:...|  1.0|
|2017-04-14 00:00:...|  1.1|
+--------------------+-----+

同様に、日付と時刻を文字列形式で提供すると、包括的な検索が実行されます。

test_df.filter(F.col("start").between('2017-04-13 12:00:00','2017-04-14 00:00:00')).show()

+--------------------+-----+
|               start|value|
+--------------------+-----+
|2017-04-13 12:00:...|  1.0|
|2017-04-14 00:00:...|  1.1|
+--------------------+-----+
5
Vinay Kolar