to_timestamp с искрой scala возвращает ноль

Я пытаюсь преобразовать столбец, содержащий значение даты в строковом формате, в формат отметки времени в Apache Spark Scala.

Ниже приведено содержимое фрейма данных (retailsNullRem):

+---------+---------+--------------+----------+
|InvoiceNo|StockCode|   InvoiceDate|customerID|
+---------+---------+--------------+----------+
|   536365|   85123A|12/1/2010 8:26|     17850|
|   536365|    71053|12/1/2010 8:26|     17850|
|   536365|   84406B|12/1/2010 8:26|     17850|
|   536365|   84029G|12/1/2010 8:26|     17850|
|   536365|   84029E|12/1/2010 8:26|     17850|
|   536365|    22752|12/1/2010 8:26|     17850|
|   536365|    21730|12/1/2010 8:26|     17850|
|   536366|    22633|12/1/2010 8:28|     17850|
|   536366|    22632|12/1/2010 8:28|     17850|
|   536367|    84879|12/1/2010 8:34|     13047|

«InvoiceDate» - это столбец, который я конвертирую в метку времени. Я попробовал приведенный ниже код для преобразования.

val timeFmt = "MM/dd/yyyy HH:mm"
val retails = retailsNullRem
            .withColumn("InvoiceDateTS", to_timestamp(col("InvoiceDate"), timeFmt))

В источнике данных указано, что формат даты - месяц / день / год час: мин. Но приведенный выше код возвращает «Null» для столбца InvoiceDateTS. Я даже пробовал использовать такой формат ("% M /% d /% y% H:% m"), поскольку в некоторых случаях месяц, день и час не содержали ведущего 0, но все равно получали ноль. Пожалуйста, объясните мне, что мне не хватает.

Ниже приведен пример вывода:

+---------+---------+--------------+----------+-------------+
|InvoiceNo|StockCode|   InvoiceDate|customerID|InvoiceDateTS|
+---------+---------+--------------+----------+-------------+
|   536365|   85123A|12/1/2010 8:26|     17850|         null|
|   536365|    71053|12/1/2010 8:26|     17850|         null|
|   536365|   84406B|12/1/2010 8:26|     17850|         null|
|   536365|   84029G|12/1/2010 8:26|     17850|         null|
|   536365|   84029E|12/1/2010 8:26|     17850|         null|
|   536365|    22752|12/1/2010 8:26|     17850|         null|
|   536365|    21730|12/1/2010 8:26|     17850|         null|
|   536366|    22633|12/1/2010 8:28|     17850|         null|
|   536366|    22632|12/1/2010 8:28|     17850|         null|
|   536367|    84879|12/1/2010 8:34|     13047|         null|

person vignesh    schedule 30.04.2020    source источник
comment
вы уверены, что ваш формат ввода соответствует входным данным? Я имею в виду, MM/dd/yyyy HH:mm требует, чтобы дни состояли из двух цифр - то же самое для значения часов   -  person UninformedUser    schedule 30.04.2020
comment
@UninformedUser, спасибо за ответ. Я немного не уверен, в какой-то строке у меня есть дата с двумя цифрами дней (например, 10, 11, 12). То же самое происходит с месяцем, где я могу получить однозначный месяц (1, 2, 3 для января, февраля, марта), а также двухзначный час (например, 21, 22, 23). Не уверен, что это причина проблемы и как я могу с этим справиться.   -  person vignesh    schedule 30.04.2020


Ответы (2)


Я не уверен, почему это не работает, я пробовал ниже, и это сработало

import spark.implicits._

scala> val df=Seq("12/1/2010 8:26", "12/1/2010 8:29").toDF("t")
df: org.apache.spark.sql.DataFrame = [t: string]

scala> df.with
withColumn   withColumnRenamed   withWatermark

scala> df.withColumn
withColumn   withColumnRenamed

scala> df.withColumn("s",col("t").cast("timestamp")).show
+--------------+----+
|             t|   s|
+--------------+----+
|12/1/2010 8:26|null|
|12/1/2010 8:29|null|
+--------------+----+


scala> import org.apache.spark.sql.functions._
import org.apache.spark.sql.functions._

scala> df.withColumn("s",to_timestamp(col("t"),"MM/dd/yyyy HH:mm")).show
+--------------+-------------------+
|             t|                  s|
+--------------+-------------------+
|12/1/2010 8:26|2010-12-01 08:26:00|
|12/1/2010 8:29|2010-12-01 08:29:00|
+--------------+-------------------+
person user13434360    schedule 30.04.2020
comment
Спасибо за ответ. Я пробую тот же код, но получаю нулевое значение. Можете ли вы предложить какой-либо другой сценарий, в котором возникает эта проблема. - person vignesh; 30.04.2020

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

ваш файл данных с: https://www.kaggle.com/carrie1/ecommerce-data/home#data.csv

InvoiceNo,StockCode,Description,Quantity,InvoiceDate,UnitPrice,CustomerID,Country
536365,85123A,WHITE HANGING HEART T-LIGHT HOLDER,6,12/1/2010 8:26,2.55,17850,United Kingdom
536365,71053,WHITE METAL LANTERN,6,12/1/2010 8:26,3.39,17850,United Kingdom
536365,84406B,CREAM CUPID HEARTS COAT HANGER,8,12/1/2010 8:26,2.75,17850,United Kingdom
536365,84029G,KNITTED UNION FLAG HOT WATER BOTTLE,6,12/1/2010 8:26,3.39,17850,United Kingdom
536365,84029E,RED WOOLLY HOTTIE WHITE HEART.,6,12/1/2010 8:26,3.39,17850,United Kingdom
536365,22752,SET 7 BABUSHKA NESTING BOXES,2,12/1/2010 8:26,7.65,17850,United Kingdom
536365,21730,GLASS STAR FROSTED T-LIGHT HOLDER,6,12/1/2010 8:26,4.25,17850,United Kingdom
536366,22633,HAND WARMER UNION JACK,6,12/1/2010 8:28,1.85,17850,United Kingdom
536366,22632,HAND WARMER RED POLKA DOT,6,12/1/2010 8:28,1.85,17850,United Kingdom
536367,84879,ASSORTED COLOUR BIRD ORNAMENT,32,12/1/2010 8:34,1.69,13047,United Kingdom
536367,22745,POPPY'S PLAYHOUSE BEDROOM ,6,12/1/2010 8:34,2.1,13047,United Kingdom
536367,22748,POPPY'S PLAYHOUSE KITCHEN,6,12/1/2010 8:34,2.1,13047,United Kingdom
536367,22749,FELTCRAFT PRINCESS CHARLOTTE DOLL,8,12/1/2010 8:34,3.75,13047,United Kingdom
536367,22310,IVORY KNITTED MUG COSY ,6,12/1/2010 8:34,1.65,13047,United Kingdom
536367,84969,BOX OF 6 ASSORTED COLOUR TEASPOONS,6,12/1/2010 8:34,4.25,13047,United Kingdom

код в IntelliJ

      val df = sqlContext
        .read
        .option("header", true)
        .option("inferSchema", true)
        .csv("/home/cloudera/files/tests/timestamp.csv")
        .cache()

      df.show(5, truncate = false)
      df.printSchema()

      import org.apache.spark.sql.functions._
      // You can try this with dataframe functions
      val retails = df
        .withColumn("InvoiceDateTS", to_timestamp(col("InvoiceDate"), "MM/dd/yyyy HH:mm"))

      retails.show(5, truncate = false)
      retails.printSchema()

      // or sparkSQL
      df.createOrReplaceTempView("df")
      val retailsSQL = sqlContext.sql(
        """
          |SELECT InvoiceNo,StockCode,InvoiceDate,customerID, TO_TIMESTAMP(InvoiceDate,"MM/dd/yyyy HH:mm") AS InvoiceDateTS
          |FROM df
          |""".stripMargin)

      retailsSQL.show(5,truncate = false)
      retailsSQL.printSchema()

выход

+---------+---------+----------------------------------+--------+--------------+---------+----------+--------------+
|InvoiceNo|StockCode|Description                       |Quantity|InvoiceDate   |UnitPrice|CustomerID|Country       |
+---------+---------+----------------------------------+--------+--------------+---------+----------+--------------+
|536365   |85123A   |WHITE HANGING HEART T-LIGHT HOLDER|6       |12/1/2010 8:26|2.55     |17850     |United Kingdom|
|536365   |71053    |WHITE METAL LANTERN               |6       |12/1/2010 8:26|3.39     |17850     |United Kingdom|
+---------+---------+----------------------------------+--------+--------------+---------+----------+--------------+
only showing top 2 rows

root
 |-- InvoiceNo: string (nullable = true)
 |-- StockCode: string (nullable = true)
 |-- Description: string (nullable = true)
 |-- Quantity: integer (nullable = true)
 |-- InvoiceDate: string (nullable = true)
 |-- UnitPrice: double (nullable = true)
 |-- CustomerID: integer (nullable = true)
 |-- Country: string (nullable = true)

+---------+---------+----------------------------------+--------+--------------+---------+----------+--------------+-------------------+
|InvoiceNo|StockCode|Description                       |Quantity|InvoiceDate   |UnitPrice|CustomerID|Country       |InvoiceDateTS      |
+---------+---------+----------------------------------+--------+--------------+---------+----------+--------------+-------------------+
|536365   |85123A   |WHITE HANGING HEART T-LIGHT HOLDER|6       |12/1/2010 8:26|2.55     |17850     |United Kingdom|2010-12-01 08:26:00|
|536365   |71053    |WHITE METAL LANTERN               |6       |12/1/2010 8:26|3.39     |17850     |United Kingdom|2010-12-01 08:26:00|
+---------+---------+----------------------------------+--------+--------------+---------+----------+--------------+-------------------+
only showing top 2 rows

root
 |-- InvoiceNo: string (nullable = true)
 |-- StockCode: string (nullable = true)
 |-- Description: string (nullable = true)
 |-- Quantity: integer (nullable = true)
 |-- InvoiceDate: string (nullable = true)
 |-- UnitPrice: double (nullable = true)
 |-- CustomerID: integer (nullable = true)
 |-- Country: string (nullable = true)
 |-- InvoiceDateTS: timestamp (nullable = true)

+---------+---------+--------------+----------+-------------------+
|InvoiceNo|StockCode|InvoiceDate   |customerID|InvoiceDateTS      |
+---------+---------+--------------+----------+-------------------+
|536365   |85123A   |12/1/2010 8:26|17850     |2010-12-01 08:26:00|
|536365   |71053    |12/1/2010 8:26|17850     |2010-12-01 08:26:00|
+---------+---------+--------------+----------+-------------------+
only showing top 2 rows

root
 |-- InvoiceNo: string (nullable = true)
 |-- StockCode: string (nullable = true)
 |-- InvoiceDate: string (nullable = true)
 |-- customerID: integer (nullable = true)
 |-- InvoiceDateTS: timestamp (nullable = true)
person Chema    schedule 30.04.2020
comment
Спасибо за ответ. Но я все еще сталкиваюсь с той же проблемой, я использую набор данных из: kaggle.com/ carrie1 / ecommerce-data / home. Похоже, проблема только в файле. Не могли бы вы указать мне на любой другой ресурс, где я могу найти аналогичный набор данных - person vignesh; 30.04.2020
comment
Докажу данные и посмотрю - person Chema; 30.04.2020
comment
Я изменил свой ответ на исходные данные из Kaggle - person Chema; 30.04.2020
comment
Я совершенно потерялся здесь, @Chema. Ваш тот же код в моей системе возвращает значение null. Я не мог понять, это какая-то проблема с конфигурацией. Я сообщу вам, как только пойму, какую ошибку совершаю. Пожалуйста, дайте мне знать, есть ли какие-либо сценарии, которые вызывают подобные проблемы. Большое спасибо за уделенное время. - person vignesh; 30.04.2020
comment
Какая у вас среда? или, может быть, это могут быть проблемы с кодировкой символов или часового пояса. - person Chema; 30.04.2020
comment
извините за поздний ответ, я был вдали от своей системы. Я использую spark-3.0.0-preview2 с локальной системой. - person vignesh; 01.05.2020
comment
Вы используете IDE, например intelliJ или Eclipse? Linux, Mac или оконная система? вы пробовали другую версию Spark? - person Chema; 01.05.2020
comment
Давайте продолжим это обсуждение в чате. - person vignesh; 01.05.2020
comment
я не мог понять причину проблемы. Однако я выполнил небольшую хитрость, обработав весь файл скриптом Python и переформатировав все InvoiceDate в «гггг-мм-дд ЧЧ: ММ: СС», и он работал нормально. Это не решение, но я не могу тратить на это больше времени. Во всяком случае, большое спасибо за вашу помощь. - person vignesh; 06.05.2020