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|
+--------------------+-----+
答えを見つけた。 pysparkの「between」関数は、タイムスタンプ入力の処理に一貫性がありません。
上記の例の場合、以下は排他検索の出力です(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|
+--------------------+-----+