Ho un CSV in cui un campo è datetime in un formato specifico. Non posso importarlo direttamente nel mio Dataframe perché deve essere un timestamp. Così ho importarlo come stringa e convertirlo in un Timestamp
come questoUn modo migliore per convertire un campo stringa in data e ora in Spark
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)
}
C'è una migliore, modo più conciso per fare questo, con l'API dataframe o scintille sql? Il metodo sopra richiede la creazione di un RDD e di fornire nuovamente lo schema per il Dataframe.
L'ho già fatto. Ho sentito che dovrei affrontare il problema principale prima di passare a simili sottigliezze. Se c'è una soluzione migliore, potrebbe non doverlo fare affatto. Il problema riguarda la file rows.map che restituisce rdd e dovrà essere convertito in ddf. Quindi potrebbe essere che manca ddf api o non so come farlo. – user568109
Non so se c'è un altro modo, ma è possibile convertire qualsiasi RDD in un DF senza problemi. In questo esempio concreto con 'sqlContext.createDataFrame (rowRDD, schema)'. Per me spark sql è bello interrogare i tuoi dati in un modo simile a SQL, non analizzare i dati stessi (per esempio, usa semplici RDD). – jarandaf
Prova (nuovo Timestamp (format.parse (s) .getTime)). ToOption – nont