2015-09-06 84 views
0

我想在SparkR過濾的DataFrame行的數據幀的時間戳由時間戳與類似的格式如下:過濾行通過SparkR

df <- createDataFrame(sqlContext, data.frame(ID = c(1,2,3), 
              Timestamp=c('08/01/2014 11:18:30', 
                 '01/01/2015 12:13:45', 
                 '05/01/2015 14:17:33'))) 

請注意,原來的架構TimeStampString。說我要03/01/2015 00:00:00之前過濾那些時間戳,我覺得可能是做這兩種方法:

一是列突變爲timestamp像正常R 2與dplyrlubridate

df %>% 
mutate(Timestamp = mdy_hms(Timestamp)) %>% 
filter(Timestamp < mdy_hms('03/01/2015 00:00:00')) 

但我沒有突變DataFrame的列,因爲它是S4類Column不是矢量。

第二條本辦法可能是註冊DataFrame作爲一個表,然後使用SparkSQL處理timestamp類型:

df <- createDataFrame(sqlContext, data.frame(ID = c(1,2,3), 
              Timestamp=c('08/01/2014 11:18:30', 
                 '01/01/2015 12:13:45', 
                 '05/01/2015 14:17:33'))) 
registerTempTable(df, 'df') 
head(sql(sqlContext, 'SELECT * FROM df WHERE Timestamp < "03/01/2015 00:00:00"')) 

但由於它仍然是一個字符串比較,因此會給錯誤的結果。什麼是正確的方法來做到這一點?

回答

3

星火1.6+

您應該能夠使用unix_timestamp功能和標準SQLContext

ts <- unix_timestamp(df$Timestamp, 'MM/dd/yyyy HH:mm:ss') %>% 
    cast("timestamp") 

df %>% 
    where(ts < cast(lit("2015-03-01 00:00:00"), "timestamp")) 

星火< 1.

這應該做的伎倆:

sqlContext <- sparkRHive.init(sc) 

query <- "SELECT * FROM df 
    WHERE unix_timestamp(Timestamp, 'MM/dd/yyyy HH:mm:ss') < 
      unix_timestamp('2015-03-01 00:00:00')" # yyyy-MM-dd HH:mm:ss 

df <- createDataFrame(sqlContext, ...) 
registerTempTable(df, 'df') 

head(sql(sqlContext, query)) 

## ID   Timestamp 
## 1 1 08/01/2014 11:18:30 
## 2 2 01/01/2015 12:13:45 

請注意,在這裏選擇上下文很重要。由於unix_timestamp是Hive UDF標準SQLContext,因此您在默認情況下在SparkR中將無法在此處使用。

+0

謝謝你的回答。我還有一個問題,如果我想將模式從「字符串」更改爲「時間戳」,我怎麼能在'SparkR'中執行?我嘗試了''查詢< - 「來自df的SELECT ID,from_unixtime(unix_timestamp(Timestamp,'MM/dd/yyyy HH:mm:ss'))ts' newDf <-sql(sqlContext,query) newDf $ ts < cast(newDf $ ts,「timestamp」) head(newDf)'但它有錯誤'不能強制類「」jobj「」到一個data.frame' – Bamqf

+0

據我所知,你的查詢沒有錯儘管你可以簡單地使用這個''SELECT ID,TIMESTAMP(unix_timestamp(Timestamp,'MM/dd/yyyy HH:mm:ss'))ts FROM df「')。看起來,所需的轉換根本不在SparkR中實現。 – zero323