0

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')))

TimeStamp列の元のスキーマは であることに注意してくださいString。の前にそれらのタイムスタンプをフィルタリングしたいとし03/01/2015 00:00:00ます。これを行うには 2 つの方法があると思います。

timestamp1 つは、通常の R のように列を変更し、 dplyrand を使用することlubridateです。

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

しかし、ベクトルではなくDataFrameS4 クラスであるため、列の変更に失敗しました。Column

2番目のアプローチは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"'))

しかし、これはまだ文字列比較であるため、間違った結果が得られます。これを行う正しい方法は何ですか?

4

1 に答える 1

3

スパーク 1.6+

unix_timestampfunction と standardを使用できるはずです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

ここでは、コンテキストの選択が重要であることに注意してください。SparkRでデフォルトで取得unix_timestampする Hive UDF 標準であるSQLContextため、ここでは機能しません。

于 2015-09-06T08:27:30.423 に答える