Почему spark (Python) поглощает мои миллисекунды? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть метки времени в миллисекундном формате, и мне нужно преобразовать их из системного времени в UTC.В любом случае ... при выполнении искры преобразования сжигают мои миллисекунды и просто показывают их в виде нулей.

Краткий пример:

from pyspark import Row
from pyspark import SparkContext
from pyspark.sql.functions import to_timestamp, date_format

spark = SparkContext.getOrCreate()

test = spark.createDataFrame([Row(timestamp = "2018-03-24 14:37:12,133")])
test_2 = test.withColumn('timestamp_2', to_timestamp('timestamp', 'yyyy-MM-dd HH:mm:ss,SSS'))
test_3 = test_2.withColumn('timestamp_3', date_format('timestamp_2', 'yyyy-MM-dd HH:mm:ss,SSS'))
test_3.write.option('header', True).csv('something')

Это приведет к:

timestamp,timestamp_2,timestamp_3
"2018-03-24 14:37:12,133",2018-03-24T14:37:12.000+01:00,"2018-03-24 14:37:12,000"

Могу ли я как-то сохранить миллисекунды?

Я использую python 3.6.4 и версию 2.3.2 spark.

1 Ответ

0 голосов
/ 12 октября 2018

удалось заставить его работать сейчас.Поскольку похоже, что spark не может корректно работать с миллисекундами, я определил UDF, который использует пакеты pytz и datetime, чтобы преобразовать строку в datetime, изменить часовой пояс и затем снова напечатать строку.

import pytz
from datetime import datetime
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
from pyspark import Row
from pyspark import SparkContext

spark = SparkContext.getOrCreate()

def convert_to_utc(timestamp):
    local = pytz.timezone("Arctic/Longyearbyen")
    naive = datetime.strptime(timestamp, '%Y-%m-%d %H:%M:%S,%f')
    local_dt = local.localize(naive, is_dst=None)
    utc_dt = local_dt.astimezone(pytz.utc)
    return utc_dt.strftime('%Y-%m-%d %H:%M:%S,%f')[:-3]

convert_to_utc_udf = udf(lambda timestamp: convert_to_utc(timestamp), StringType())

test = spark.createDataFrame([Row(timestamp = "2018-03-24 14:37:12,133")])
test_2 = test.withColumn('timestamp_2', convert_to_utc_udf('timestamp'))
test_2.write.option('header', True).csv('something')

#Output:
#timestamp,timestamp_2
#"2018-03-24 14:37:12,133","2018-03-24 13:37:12,133"

Вдохновлен:

Как преобразовать строковый столбец с миллисекундами в метку времени с миллисекундами в Spark 2.1 с использованием Scala?

И:

Как преобразовать местное время в UTC в Python?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...