Приведение API pyspark Dataframe ('timestamp') не работает со строками меток времени

У меня есть данные, которые выглядят так:

{"id":1,"createdAt":"2016-07-01T16:37:41-0400"}
{"id":2,"createdAt":"2016-07-01T16:37:41-0700"}
{"id":3,"createdAt":"2016-07-01T16:37:41-0400"}
{"id":4,"createdAt":"2016-07-01T16:37:41-0700"}
{"id":5,"createdAt":"2016-07-06T09:48Z"}
{"id":6,"createdAt":"2016-07-06T09:48Z"}
{"id":7,"createdAt":"2016-07-06T09:48Z"}

Я использую поле createdAt для метки времени следующим образом.

from pyspark.sql import SQLContext
from pyspark.sql.functions import *

sqlContext = SQLContext(sc)
df = sqlContext.read.json('data/test.json')
dfProcessed = df.withColumn('createdAt', df.createdAt.cast('timestamp'))

dfProcessed.printSchema()
dfProcessed.collect()

Вывод, который я получаю, выглядит следующим образом. Я получаю значения None для createdAt. Что я могу сделать, чтобы получить поле как правильную временную метку?

root
 |-- createdAt: timestamp (nullable = true)
 |-- id: long (nullable = true)

[Row(createdAt=None, id=1),
 Row(createdAt=None, id=2),
 Row(createdAt=None, id=3),
 Row(createdAt=None, id=4),
 Row(createdAt=None, id=5),
 Row(createdAt=None, id=6),
 Row(createdAt=None, id=7)]

person Gopala    schedule 09.07.2016    source источник
comment
Кстати, какую версию Apache Spark вы используете?   -  person Alberto Bonsanto    schedule 10.07.2016


Ответы (1)


Чтобы просто привести строковый столбец к метке времени, строковый столбец должен быть правильно отформатирован.

Чтобы получить столбец «createdAt» в качестве метки времени, вы можете написать функцию UDF, которая преобразует строку

"2016-07-01T16:37:41-0400"

to

"2016-07-01 16:37:41"

и преобразовать столбец «createdAt» в новый формат (не забудьте обработать поле часового пояса).

Если у вас есть столбец, содержащий временные метки в виде строк типа «2016-07-01 16:37:41», простое приведение к временной метке выполнит эту работу, как это есть в вашем коде.

Вы можете узнать больше об обработке даты/времени/строки в Spark здесь.

person Milos Milovanovic    schedule 11.07.2016
comment
Понял. Спасибо. Я надеялся избежать UDF и дополнительной обработки с чем-то встроенным, что позаботится об этом более эффективно. Но, похоже, его нет. - person Gopala; 12.07.2016