は、あなただけの日付フォーマットの種類を認識するために、余分なコーディングを少し必要です。 例えば、あなたのデータがでフォーマットを下回っていると言うことができます -
data = [("2008-05-01",1),("2018-01-01",2),("03/14/2017",3),("01/01/2018",4)]
df = spark.createDataFrame(data,schema=['date','key'])
df.show()
:
+----------+---+
| date|key|
+----------+---+
|2008-05-01| 1|
|2018-01-01| 2|
|03/14/2017| 3|
|01/01/2018| 4|
+----------+---+
:
from pyspark.sql.functions import *
from pyspark.sql.types import *
# udf that recognise pattern and return list of year,month and day
def splitUDF(row):
if "/" in row:
mm,dd,yyyy = row.split("/")
elif "-" in row:
yyyy,mm,dd = row.split("-")
return [yyyy,mm,dd]
datSplitterUDF = udf(lambda row : splitUDF(row),ArrayType(StringType()))
df\
.select(datSplitterUDF(df.date).alias("dt"))\
.withColumn('year',col('dt').getItem(0).cast('int'))\
.withColumn('month',col('dt').getItem(1).cast('int'))\
.withColumn('day',col('dt').getItem(2).cast('int'))\
.show()
出力:
+--------------+----+-----+---+
| dt|year|month|day|
+--------------+----+-----+---+
|[2008, 05, 01]|2008| 5| 1|
|[2018, 01, 01]|2018| 1| 1|
|[2017, 03, 14]|2017| 3| 14|
|[2018, 01, 01]|2018| 1| 1|
+--------------+----+-----+---+
私の質問が更新されました。分割されていますが、各区切り文字に異なる形式があります。 –
を入力する必要がありますので、割り当て線にさらにロジックを追加する必要があります。例えば。 4桁の場合はその年の日など – Dandekar