Я создаю файл паркета из чтения данных из Oracle.
Oracle работает в UTC. Я подтвердил использование
SELECT DBTIMEZONE FROM DUAL;
Вывод:
DBTIMEZONE|
----------|
+00:00 |
Чтение из JDBC и запись в S3 как паркет:
df = spark.read.format('jdbc').options(url=url,
dbtable=query,
user=user,
password=password,
fetchsize=2000).load()
df.write.parquet(s3_loc, mode="overwrite")
Теперь я проверил значение spark.sql.session.timeZone
print(spark.conf.get("spark.sql.session.timeZone"))
Вывод:
UTC
Теперь я читаю данные из местоположения S3:
df1 = spark.read.parquet(s3_loc)
df1.show()
Вывод:
+-------------------+
| col1 |
+-------------------+
|2012-11-11 05:00:00|
|2013-11-25 05:00:00|
|2013-11-11 05:00:00|
|2014-12-25 05:00:00|
+-------------------+
col1
- это дата в oracle и преобразованная в метку времени в spark df.
Почему в вывод добавляется 5 часов? База данных работает в формате UTC, а spark.sql.session.timeZone
- в формате UTC.
Примечание:
- RDS и EMR работают в AWS US-EAST-1
- На всех искровых узлах я выполнил
TZ=UTC