2017-04-14 128 views
2

pyspark的「between」功能不包括時間戳輸入。例如,如果我們想要兩個日期之間的所有行,例如'2017-04-13'和'2017-04-14',那麼當日期作爲字符串傳遞時,它會執行「排他性」搜索。即,它省略了「2017年4月14日00:00:00」字段pyspark的「之間」功能:範圍搜索時間戳不包含

然而,該文獻似乎暗示它是包容性([http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html],時間戳沒有參考雖然)

當然,一種方法是從上限增加一個微秒並將其傳遞給該函數。但是,這不是一個很好的解決方案任何干淨的做包容性搜索的方式?

實施例:

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| 
+--------------------+-----+ 

回答

1

找到答案。 pyspark的「之間」功能在處理時間戳輸入時不一致。

  1. 如果您沒有時間提供字符串格式的輸入,它會執行排他性搜索(不是我們期望從上面鏈接的文檔中獲得的)。
  2. 如果提供輸入作爲日期時間的對象或與確切的時間(例如,「2017年4月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| 
+--------------------+-----+ 
+0

有趣點。但輸出顯示相同。你能詳細說明嗎? – PR102012

+0

以上兩種方法產生包含性搜索(因此輸出相同)。但是,如果我們只是將日期作爲字符串傳遞(請參閱問題),我們將獲得專有搜索。問題的關鍵在於:如果您希望包容性搜索使用上述任一方法,並且不要只使用日期字符串(例如'F.between('2017-04-13','2017-04-14')') –