Meilleur moyen de convertir un champ de chaîne en horodatage dans Spark
J'ai un fichier CSV dans lequel un champ datetime dans un format spécifique. Je ne peux pas l'importer directement dans mon Dataframe, parce qu'il faut un horodatage. J'ai donc l'importer en tant que chaîne et de le convertir en un Timestamp
comme ce
import java.sql.Timestamp
import java.text.SimpleDateFormat
import java.util.Date
import org.apache.spark.sql.Row
def getTimestamp(x:Any) : Timestamp = {
val format = new SimpleDateFormat("MM/dd/yyyy' 'HH:mm:ss")
if (x.toString() == "")
return null
else {
val d = format.parse(x.toString());
val t = new Timestamp(d.getTime());
return t
}
}
def convert(row : Row) : Row = {
val d1 = getTimestamp(row(3))
return Row(row(0),row(1),row(2),d1)
}
Est-il mieux, de manière plus concise à cela, le Dataframe de l'API ou de l'étincelle-sql? La méthode ci-dessus nécessite la création d'un EDR et à donner le schéma du Dataframe de nouveau.
source d'informationauteur user568109
Vous devez vous connecter pour publier un commentaire.
Spark >= 2.2
Spark >= 1.6, < 2.2
Vous pouvez utiliser la date de la transformation des fonctions qui ont été introduites dans Spark 1.5. En supposant que vous avez les données suivantes:
Vous pouvez utiliser
unix_timestamp
analyser les chaînes, et de le jeter à l'horodatageComme vous pouvez le voir, il couvre à la fois l'analyse et le traitement des erreurs.
Spark >= 1.5, < 1.6
Vous aurez à utiliser quelque chose comme ceci:
ou
en raison de SPARK-11724.
Spark < 1.5
vous devriez être en mesure de les utiliser avec
expr
etHiveContext
.Je n'ai pas joué avec Spark SQL encore, mais je pense que ce serait plus idiomatiques scala (null utilisation n'est pas considérée comme une bonne pratique):
Remarquez s'il vous plaît je suppose que vous savez
Row
de types d'éléments à l'avance (si vous l'avez lu à partir d'un fichier csv, elles sontString
), c'est pourquoi j'ai utiliser un type commeString
et pasAny
(tout est sous-type deAny
).Elle dépend aussi de la façon dont vous souhaitez gérer les exceptions de parsage. Dans ce cas, si une analyse exception se produit, un
None
est simplement retourné.Vous pouvez l'utiliser plus loin avec:
J'ai ISO8601 timestamp dans mon dataset et j'avais besoin de le convertir en "aaaa-MM-jj". C'est ce que j'ai fait:
Et vous pouvez simplement utiliser l'UDF dans votre étincelle de requête SQL.
Je voudrais déplacer le
getTimeStamp
méthode écrit par vous en rdd est mapPartitions et la réutilisation GenericMutableRow entre les lignes dans un itérateur:Et vous devriez toujours utiliser le schéma pour générer un DataFrame
L'utilisation de GenericMutableRow à l'intérieur d'un itérateur de la mise en œuvre pourrait se trouver dans Agrégation De L'OpérateurInMemoryColumnarTableScanParquetTableOperations etc.
Je voudrais utiliser https://github.com/databricks/spark-csv
Cela permettra de déduire des horodateurs pour vous.