2017-12-13 1 views
2

큰 파일을 작업하고 있습니다. mmddyy 형식의 필드 중 하나에 문자열을 데이터 형식으로 가지고 있는데이를 YYYY-MM-DD로 변환해야합니다. 나는 UDF를 만들려고 시도하고 게시물 중 하나를 언급하지만 변환 오류는 던지는 오류. 샘플 코드 : dataframe에서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으로 데이터를 구문 분석하십시오. 당신이 스파크 버전이있는 경우

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

은 2.2 더욱 편리한 방법이있다, to_date :

다음 당신에게 당신이 기본적으로 원하는 형식 (yyyy-mm-dd)을 줄 것이다 DateType에 열을 캐스팅
df.withColumn('DATE_OPENEND', to_date('DATE_OPENED','mmddyy'))