2016-07-01 6 views
4

は、たぶん私は何かを明らかに行方不明ですが、日付比較はここにオフになっているようだ:猫2016-06-29T09:11:26Z上の日付が考慮される理由は、私は理解していない何datetimeオブジェクトと8601文字列を比較すると間違った結果が得られますが、なぜ許可されますか?

+----------+--------------------+ 
|customerId|   timeStamp| 
+----------+--------------------+ 
|  Cat|2016-06-29T09:11:26Z| 
|  Hat|2016-07-30T09:11:26Z| 
|  Bat|2016-06-29T23:11:26Z| 
+----------+--------------------+ 

from pyspark import SparkContext 
from pyspark.sql import SQLContext 

import pandas as pd 
import datetime 

sc = SparkContext() 
sqlContext = SQLContext(sc) 

action_pandas_df = pd.DataFrame({"customerId": ["Cat", "Hat", "Bat"], 
           "timeStamp": ["2016-06-29T09:11:26Z", 
               "2016-07-30T09:11:26Z", 
               "2016-06-29T23:11:26Z"]}) 

action_df = sqlContext.createDataFrame(action_pandas_df) 
action_df.show() 

cut_off = datetime.datetime(2016, 6, 29, 15) 

print "\033[0;34m{}\033[0m".format(cut_off.strftime(format='%Y-%m-%dT%H:%M:%SZ')) 

new_df = action_df.filter(action_df.timeStamp > cut_off) 
new_df.show() 

私が手cut_offより大きく、2016-06-29T15:00:00Zである。

私はcutoffの代わりにcut_off.strftime(format='%Y-%m-%dT%H:%M:%SZ')を使用できることを知っています。予想通りの結果が得られます。サイドノートとして

cut_off = datetime.datetime(2016, 7, 10, 15) 

期待通りに私のコードは動作します:大きなcut_off日付の

、私が期待される結果を得ます。

datatimeオブジェクトと8601文字列を比較するのはなぜですか?

私には何が欠けていますか?

編集:

私は編集2 1.5

をスパークを使用しています:

スパーク1.6.1は、同じ動作を提供します。

答えて

3

日付を比較しないためです。型が一致せず、列が文字列であるため、クエリも文字列にキャストされます。 SQLでcut_offの文字列表現は2016-06-29 15:00:00です:

from pyspark.sql.functions import lit 

cut_off = datetime.datetime(2016, 6, 29, 15) 

action_df.select(lit(cut_off).cast("string")).limit(1).show() 
## +--------------------------------+ 
## |cast(1467205200000000 as string)| 
## +--------------------------------+ 
## |    2016-06-29 15:00:00| 
## +--------------------------------+ 

、あなたは辞書式順序と>' ''T'を使用して文字列を比較します。あなたはフォーマットされた文字列と比較することができ、次のいずれか

cut_off_str = cut_off.strftime(format='%Y-%m-%dT%H:%M:%SZ') 

action_df.where(action_df.timeStamp > cut_off_str).show() 
## +----------+--------------------+ 
## |customerId|   timeStamp| 
## +----------+--------------------+ 
## |  Hat|2016-07-30T09:11:26Z| 
## |  Bat|2016-06-29T23:11:26Z| 
## +----------+--------------------+ 

または最初の列を解析:

from pyspark.sql.functions import unix_timestamp 

timestamp_parsed = (unix_timestamp(action_df.timeStamp, "yyyy-MM-dd'T'kk:mm:ss") 
    .cast("double")  # Required only for Spark 1.5 
    .cast("timestamp")) 

action_df.where(timestamp_parsed > cut_off).show() 
## +----------+--------------------+ 
## |customerId|   timeStamp| 
## +----------+--------------------+ 
## |  Hat|2016-07-30T09:11:26Z| 
## |  Bat|2016-06-29T23:11:26Z| 
## +----------+--------------------+ 
関連する問題