Convert using unixtimestamp to Date

I have a field in a dataframe that has a column with date like 1632838270314 as an example

I want to convert it to date like 'yyyy-MM-dd' I have this so far but it doesn't work:

date = df['createdOn'].cast(StringType())
df = df.withColumn('date_key',unix_timestamp(date),'yyyy-MM-dd').cast("date"))

createdOn is the field that derives the date_key


The method unix_timestamp() is for converting a timestamp or date string into the number seconds since 01-01-1970 ("epoch"). I understand that you want to do the opposite.

Your example value "1632838270314" seems to be milliseconds since epoch.

Here you can simply cast it after converting from milliseconds to seconds:

from pyspark.sql import functions as F

df = sql_context.createDataFrame([
    Row(unix_in_ms=1632838270314),
])
(
    df
    .withColumn('timestamp_type', (F.col('unix_in_ms')/1e3).cast('timestamp'))
    .withColumn('date_type', F.to_date('timestamp_type'))
    .withColumn('string_type', F.col('date_type').cast('string'))
    .withColumn('date_to_unix_in_s', F.unix_timestamp('string_type', 'yyyy-MM-dd'))
    .show(truncate=False)
)
# Output
+-------------+-----------------------+----------+-----------+-----------------+
|unix_in_ms   |timestamp_type         |date_type |string_type|date_to_unix_in_s|
+-------------+-----------------------+----------+-----------+-----------------+
|1632838270314|2021-09-28 16:11:10.314|2021-09-28|2021-09-28 |1632780000       |
+-------------+-----------------------+----------+-----------+-----------------+

You can combine the conversion into a single command:

df.withColumn('date_key', F.to_date((F.col('unix_in_ms')/1e3).cast('timestamp')).cast('string'))