Почему pyspark читает данные из MySQL, а затем записывает в тот же MySQL, все значения столбца типа даты на сутки вперед? - PullRequest
0 голосов
/ 25 апреля 2020

MySQL версия: 5.7.29 Версия Spark: spark-2.4.5-bin-hadoop2.7

  1. источник данных в MySQL
  2. искра в сентосах 7
  3. запустить «выбрать сейчас» в MySQL == запустить «дату» в Centos7
  4. Запуск Pyspark:

a. df.filter('date_="2017-11-25"').show(), результат правильный.

+----------+--------+--------+
|     date_|behavior|quantity|
+----------+--------+--------+
|2017-11-25|      PV|  984879|
|2017-11-25|     fav|   31998|
|2017-11-25|     buy|   20687|
|2017-11-25|      UV|   73281|
|2017-11-25|    cart|   59972|
+----------+--------+--------+

b. но запустите следующий код, все значения столбца date_ равны 2017-11-24 в MySQL в windows, остальные столбцы содержат правильные данные:

df.filter('date_="2017-11-25"').write.mode('overwrite').format("jdbc").\
    option("url", "jdbc:mysql://IP:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC").\
    option("dbtable", "dailybehavior_1d_temp").\
    option("user", "root").\
    option("password", "*****").\
    option("driver", "com.mysql.cj.jdbc.Driver").\
    option("batchsize", 10000).\
    option("truncate", "true").\
    save()

enter image description here

1 Ответ

0 голосов
/ 27 апреля 2020

Я нахожу причину.

коды JDB C учитывают часовой пояс MySQL в UT C -5, но часовой пояс данных - UTC + 8.

столбец date_ меняет тип на Подобные временные метки после того, как данные считывания спарка и час 、 минута 、 секунда составляют 00: 00: 00.

Наконец, JDB C делает дату_ go обратной на 13 часов до записи MySQL.

Перед записью MySQL я изменяю столбцы date_ на string в spark, ожидается результат.

...