web-dev-qa-db-fra.com

Comment changer le type de colonne de String en Date dans DataFrames?

J'ai une trame de données qui a deux colonnes (C, D) sont définies comme type de colonne de chaîne, mais les données dans les colonnes sont en fait des dates. par exemple, la colonne C a la date "01-APR-2015" et la colonne D "20150401". Je souhaite les modifier en type de colonne de date, mais je n'ai pas trouvé un bon moyen de le faire. Je regarde le débordement de pile dont j'ai besoin pour convertir le type de colonne de chaîne en type de colonne Date dans Spark DataFrame de SQL. Le format de la date peut être "01-APR-2015" et je regarde - ce post mais il n'avait pas d'informations concernant la date

12
dbspace

Spark> = 2,2

Vous pouvez utiliser to_date:

import org.Apache.spark.sql.functions.{to_date, to_timestamp}

df.select(to_date($"ts", "dd-MMM-yyyy").alias("date"))

ou to_timestamp:

df.select(to_date($"ts", "dd-MMM-yyyy").alias("timestamp"))

avec intermédiaire unix_timestamp appel.

Spark <2,2

Depuis Spark 1.5 vous pouvez utiliser unix_timestamp fonction pour analyser la chaîne en long, la convertir en horodatage et tronquer to_date:

import org.Apache.spark.sql.functions.{unix_timestamp, to_date}

val df = Seq((1L, "01-APR-2015")).toDF("id", "ts")

df.select(to_date(unix_timestamp(
  $"ts", "dd-MMM-yyyy"
).cast("timestamp")).alias("timestamp"))

Remarque :

En fonction d'une version Spark vous pouvez nécessiter certains ajustements en raison de SPARK-11724 :

La conversion de types entiers en horodatage traite l'intégralité de la source comme étant en millis. La conversion de l'horodatage en types entiers crée le résultat en quelques secondes.

Si vous utilisez une version non corrigée unix_timestamp la sortie nécessite une multiplication par 1000.

30
zero323