Standardmäßig wird beim Laden der Daten jede Spalte als String-Typ betrachtet. Die Daten wie folgt aussehen:Ändern Sie den Datentyp einer Spalte in einer Funke-RDD auf das Datum und fragen Sie danach
firstName,lastName,age,doj
dileep,gog,21,2016-01-01
avishek,ganguly,21,2016-01-02
shreyas,t,20,2016-01-03
Nach dem Schema der RDD
Aktualisierung sieht es aus wie
temp.printSchema
|-- firstName: string (nullable = true)
|-- lastName: string (nullable = true)
|-- age: string (nullable = true)
|-- doj: date (nullable = true)
eine temporäre Tabelle Einschreibebriefe und abgefragt auf sie
temp.registerTempTable("temptable");
val temp1 = sqlContext.sql("select * from temptable")
temp1.show()
+---------+--------+---+----------+
|firstName|lastName|age| doj|
+---------+--------+---+----------+
| dileep| gog| 21|2016-01-01|
| avishek| ganguly| 21|2016-01-02|
| shreyas| t| 20|2016-01-03|
+---------+--------+---+----------+
val temp2 = sqlContext.sql("select * from temptable where doj > cast('2016-01-02' as date)")
Aber wenn ich versuche, zu Siehe das Ergebnis, das es mir gibt:
temp2: org.apache.spark.sql.DataFrame = [firstName: string, lastName: string, age: string, doj: date]
wenn ich
temp2.show()
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
Wie genau "aktualisieren" Sie das Schema? –
var x = tempSchema.toArray; val y = StructField ("dob", DateType, true); x.update (3, y) \t tempSchema = StructType (x); val temp = sqlContext.applySchema (tempSchemaRDD, tempSchema) ; – Dileep