2017-08-23 48 views
1

我有一個數據幀有多個列,其中兩個類型爲pyspark.sql.TimestampType。我想過濾這個數據幀到這兩列之間的時間差小於一個小時的行。基於兩列之間的時間差異過濾pyspark數據幀

我目前正在試圖做到這一點,像這樣: examples = data.filter((data.tstamp - data.date) < datetime.timedelta(hours=1))

但這種失敗,出現以下錯誤信息:

org.apache.spark.sql.AnalysisException: cannot resolve '(`tstamp` - `date`)' due to data type mismatch: '(`tstamp` - `date`)' requires (numeric or calendarinterval) type, not timestamp 

什麼是實現此過濾器的正確的方法?

回答

1

您的列有不同的類型,很難解釋差異的含義,通常時間戳是秒,日期是幾天。您可以將兩列,將UNIX事先時間戳來獲得秒的差別:

import pyspark.sql.functions as psf 
data.filter(
    psf.abs(psf.unix_timestamp(data.tstamp) - psf.unix_timestamp(data.date)) < 3600 
) 

編輯

此功能將處理字符串(給他們有一個正確的格式),時間戳和約會:

import datetime 
data = hc.createDataFrame(sc.parallelize([[datetime.datetime(2017,1,2,1,1,1), datetime.date(2017,8,7)]]), ['tstamp', 'date']) 
data.printSchema() 
    root 
    |-- tstamp: timestamp (nullable = true) 
    |-- date: date (nullable = true) 

data.select(
    psf.unix_timestamp(data.tstamp).alias('tstamp'), psf.unix_timestamp(data.date).alias("date") 
).show() 
    +----------+----------+ 
    | tstamp|  date| 
    +----------+----------+ 
    |1483315261|1502056800| 
    +----------+----------+ 
+0

的列是不是不同的類型,而是兩者都是'型pyspark.sql.TimestampType' – vaerek

+0

另外,這些都是dateti我的對象,所以'unix_timestamp'函數將不起作用,因爲它操作字符串輸入。我想我可以將它們從日期時間轉換爲字符串,然後通過'unix_timestamp'運行它們。我想知道是否有更直接的方法。 – vaerek

+0

在pyspark中,我們無法訪問python中的所有日期時間函數,因此時間差異的唯一其他函數可以在幾天內處理。所以,除非你編寫的UDF效率比直接的pyspark解決方案低,否則你不得不通過將它們轉換爲int來使用時間戳差異。 – MaFF