Python UTC в формат iso теперь работает — ошибка приведения

#python-3.x #pyspark #apache-spark-sql #azure-databricks

#python-3.x #pyspark #apache-spark-sql #azure-databricks

Вопрос:

Я получаю дату и время в формате UTC из datafactory в databricks. Я пытаюсь преобразовать его в временную метку databricks и вставить в базу данных.

 Format that i am  receiving: 2020-11-02T01:00:00Z
Convert into : 2020-11-02T01:00:00.000 0000 (iso format)
  

я попытался преобразовать строку в isoformat()

 df.selectExpr("make_timestamp(YEAR, MONTH, DAY, HOUR, MINUTE, SECOND) as MAKE_TIMESTAMP")
  

и затем

 spark.sql("INSERT INTO test VALUES (1, 1, 'IMPORT','"  slice_date_time.isoformat()  "','deltaload',0, '0')")
  

Но когда я пытаюсь вставить его, я получаю сообщение об ошибке:

  • Невозможно безопасно преобразовать ‘start_time’: строка в метку времени
  • Невозможно безопасно преобразовать ‘end_time’: строку в метку времени;

Я также попытался сделать временную метку. но все та же ошибка.

Ответ №1:

Использование Spark DataFrame API:

 # create dataframe
list_data = [(1, '2020-11-02T01:00:00Z'), (2, '2020-11-03T01:00:00Z'), (3, '2020-11-04T01:00:00Z')]
df = spark.createDataFrame(list_data, ['id', 'utc_time'])

# make sure to set your timezone in spark conf
from pyspark.sql.functions import to_timestamp, date_format
spark.conf.set('spark.sql.session.timeZone', 'UTC')

df.select("utc_time").withColumn('iso_time', date_format(to_timestamp(df.utc_time, "yyyy-MM-dd'T'HH:mm:ssXXX"), 
        "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    ).alias('iso_time')).show(10, False)


 -------------------- ---------------------------- 
|utc_time            |iso_time                    |
 -------------------- ---------------------------- 
|2020-11-02T01:00:00Z|2020-11-02T01:00:00.000 0000|
|2020-11-03T01:00:00Z|2020-11-03T01:00:00.000 0000|
|2020-11-04T01:00:00Z|2020-11-04T01:00:00.000 0000|
 -------------------- ---------------------------- 
  

Попробуйте сохранить iso_time непосредственно в базе данных, если ваша база данных поддерживает другой формат даты и времени, попробуйте настроить

гггг-ММ-dd’T’HH:mm:ss.SSSZ