Mam plik CSV, w którym pole jest datetime w określonym formacie. Nie mogę zaimportować go bezpośrednio do Mojego Dataframe, ponieważ musi to być znacznik czasu. Więc zaimportować go jako ciąg znaków i przekształcić go w Timestamp
jak tenLepszy sposób konwertowania pola ciągu na znacznik czasu w 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)
}
Czy istnieje lepszy, bardziej zwięzły sposób, aby to zrobić, z API Dataframe lub iskrą-SQL? Powyższa metoda wymaga utworzenia RDD i ponownego nadania schematu DataFame.
Zrobiłem to już wcześniej. Czułem, że powinienem zająć się podstawową kwestią, zanim przejdziemy do takich drobiazgów. Jeśli istnieje lepsze rozwiązanie, może wcale nie być konieczne. Problem dotyczy pliku rows.map, który zwraca rdd i będzie musiał zostać przekonwertowany na ddf. Tak może być, że brakuje ddf api lub nie wiem jak to zrobić. – user568109
Nie wiem, czy jest inny sposób, ale można przekonwertować dowolny RDD na DF bez problemu. W tym konkretnym przykładzie z 'sqlContext.createDataFrame (rowRDD, schema)'. Dla mnie iskr sql jest przyjemny do zapytania twoich danych w sposób podobny do SQL, a nie do parsowania samych danych (na takie rzeczy, użyj prostych RDD). – jarandaf
Spróbuj (nowy znacznik czasu (format.parse (s) .getTime)) toOption – nont