2016-06-13 9 views
1

を刺激するために、以下のように私はPythonのパンダのデータフレーム(pd_df)を有する:私はデータフレーム(sp_df)を点火するために変換するパンダデータフレーム(DatetimeIndex列)データフレーム(日時フォーマット)

time    count 
0 2015-01-31   835 
1 2015-02-28   1693 
2 2015-03-31   2439 

を。

私は最初の列がBIGINT形式で返された

sp_df = sqlContext.createDataFrame(pd_df). 

を試してみました:私は、次のコマンドを使用しています。

time    count 
1422662400000000000 835 
1425081600000000000 1693 

次のように私はまた、スキーマを試してみましたが、それはどちらか動作しませんでした:

from pyspark.sql.types import * 
schema = StructType([ 
    StructField("time", StringType(), True), 
    StructField("count", IntegerType(), True)]) 
sp_df = sqlContext.createDataFrame(pd_df, schema) 

それは私にエラーを与えた:

DateType can not accept object 1422662400000000000L in type <type 'long'> 

誰も私に正しい方法を提案することができますそれ?

+1

あなたのためにこれが起こっている理由は、 pandas dataframeカラムのデータ型はDatetimeIndexです。[documentation](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DatetimeIndex.html)を読んだら、日付がint64として内部的に表現されています。あなたの日付の文字列を作ってから、 'DateType'のデータ型を使ってsp_dfに変換してみてください。 –

+0

' 'StructField'オブジェクトで、' 'time"、StringType()、True'を渡す理由は? 'DateType()'を使わないのはなぜですか? –

+1

ありがとう@KatyaHandler .. datetimeを文字列に変換するというアイデアが助けになりました。以前のStructFieldオブジェクトでは、DateType()として「time」を渡しているときにエラーが発生しました。 今、pandasのdatetimeをstringに変換してから、StructField()のDateType()を使用して変換した後で動作しました。 – aditya

答えて

0

私が同じ状況でやったのは、applyを使ってdateカラム(私にとっては年の月の日であった20150129)をdateに変換するためにapplyを使うことでした。リマインダは、テーブルの各行に対して適用され、その結果が返されます。

import datetime 
pos_data['TRANSACTION_DATE_converted'] = pos_data.TRANSACTION_DATE.apply(lambda x: datetime.datetime.strptime(str(x),'%Y%m%d').date()) 

次に、あなたと同じcreateDataFrameを使用して、日付を読みました。スキーマには

TRANSACTION_DATE_converted=datetime.date(2016, 9, 6) 

と表示されていますが、まだ問題はありません。

ハイブは値を破線の文字列(つまり、20140129)として保存します。したがって、さらに悲しみを感じる場合は、日付を文字列に変換します。しかし、2つのデータ型を経るのはちょっとばかげたことです。

0

私は同じ問題を抱えていた、最速の方法は、UNIXタイムスタンプとしてBIGINTを参照して、スパークAPI関数(タイムスタンプまたは日付)を経由して、それを変換することです:

from_unixtime(df['time']/1000000000, format='yyyy-MM-dd HH:mm:ss').cast('timestamp') 
関連する問題