2017-12-13 6 views
2

私は大きなファイルを扱っています。このファイルは、mmddyy形式のフィールドの1つにデータ型としての文字列を持ち、YYYY-MM-DDに変換する必要があります。私はUDFを作成しようとしましたが、ポストの1つを参照して変換していますが、そのスローエラーです。サンプルコード:データフレームでPyspark - mmddyyをYYYY-MM-DDに変換する

実際のフィールド:

+-----------+ 
|DATE_OPENED| 
+-----------+ 
|  072111| 
|  090606| 

予想される出力:

+---------------+ 
| DATE_OPENED| 
+---------------+ 
|  2011-07-21| 
|  2006-06-09| 

サンプルコード:

func = udf (lambda x: datetime.strptime(x, '%m%d%Y'), DateType()) 

newdf = olddf.withColumn('open_dt' ,date_format(func(col('DATE_OPENED')) , 'YYYY-MM-DD')) 

エラー:

Error : ValueError: time data '072111' does not match format '%m%d%Y' 
+0

私の更新された回答を参照してください。 UDFに依存することなく、問題を解決する標準的な方法を使用します。 – Shaido

答えて

3

私はudfを作成せずにそれを解決することができました、私は同様の投稿(pyspark substring and aggregation)をスタック上で参照していました。

from pyspark.sql.functions import * 
format = 'mmddyy' 
col = unix_timestamp(df1['DATE_OPENED'], format).cast('timestamp') 
df1 = df1.withColumn("DATE_OPENED", col) 

df2 = df.withColumn('open_dt', df['DATE_OPENED'].substr(1, 11)) 
+1

あなたは 'substr'に依存するべきではありません。 'from_unixtime'を使ってフォーマットを与えることができます。 https://spark.apache.org/docs/2.2.0/api/java/org/apache/spark/sql/functions.html#from_unixtime-org.apache.spark.sql.Column-java.lang.String- –

0

これは遅いUDFに依存することなく可能です。代わりに、正しい形式を指定してunix_timestampでデータを解析します。その後、デフォルトでは、あなたがしたい形式を与えるDateTypeの列(YYYY-MM-DD)キャスト:

:あなたはスパークバージョンを2.2 +お持ちの場合

df.withColumn('DATE_OPENED', unix_timestamp('DATE_OPENED','mmddyy').cast(DateType())) 

をもっと便利な方法、to_dateがあります

df.withColumn('DATE_OPENEND', to_date('DATE_OPENED','mmddyy')) 
関連する問題