Как привести строку к метке времени с наносекундами в pyspark - PullRequest
0 голосов
/ 21 сентября 2018

Я работаю с данными с отметками времени, которые содержат наносекунды, и пытаюсь преобразовать строку в формат отметки времени.

Вот как выглядит столбец «Время»:

+---------------+
|      Time     |
+---------------+
|091940731349000|
|092955002327000|
|092955004088000|
+---------------+

Я хотел бы привести его к:

+------------------+
|    Timestamp     |
+------------------+
|09:19:40.731349000| 
|09:29:55.002327000| 
|09:29:55.004088000|  
+------------------+

Из того, что я нашел в Интернете, мне не нужно использовать udf для этого, и должна быть встроенная функция, которую я могу использовать.

Я пробовал cast и to_timestamp, но получил значения 'null':

df_new = df.withColumn('Timestamp', df.Time.cast("timestamp"))
df_new.select('Timestamp').show()

+---------+    
|Timestamp|    
+---------+    
|     null|    
|     null|    
+---------+

1 Ответ

0 голосов
/ 21 сентября 2018

В вашем коде есть две проблемы:

  • Ввод не является допустимым представлением метки времени.
  • Spark не предоставляет тип, который может представлять время без компонента даты

Самое близкое, что вы можете получить к требуемому выводу, - преобразовать ввод в JDBC-совместимый формат java.sql.Timestamp:

from pyspark.sql.functions import col, regexp_replace

df = spark.createDataFrame(
    ["091940731349000", "092955002327000", "092955004088000"], 
    "string"
).toDF("time")

df.select(regexp_replace(
  col("time"),
  "^(\\d{2})(\\d{2})(\\d{2})(\\d{9}).*", 
  "1970-01-01 $1:$2:$3.$4"
).cast("timestamp").alias("time")).show(truncate = False)

# +--------------------------+
# |time                      |
# +--------------------------+
# |1970-01-01 09:19:40.731349|
# |1970-01-01 09:29:55.002327|
# |1970-01-01 09:29:55.004088|
# +--------------------------+

Если вы хотите просто пропустить приведение строки и ограничить вывод до:

df.select(regexp_replace(
  col("time"),
  "^(\\d{2})(\\d{2})(\\d{2})(\\d{9}).*", 
  "$1:$2:$3.$4"
).alias("time")).show(truncate = False)

# +------------------+
# |time              |
# +------------------+
# |09:19:40.731349000|
# |09:29:55.002327000|
# |09:29:55.004088000|
# +------------------+
...