#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