2016-07-28 6 views
-1

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 
+0

Wie genau "aktualisieren" Sie das Schema? –

+0

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

Antwort

0

So habe ich den Code ausprobiert und es funktioniert für mich. Ich vermute, dass das Problem darin besteht, wie du das Schema anfänglich änderst, das sieht für mich aus (gewährt ist ein wenig schwer zu lesen, wenn du es in einem Kommentar postest - du solltest stattdessen die Frage mit dem Code aktualisieren).

Wie dem auch sei, ich habe es so gemacht:

zunächst Ihre Eingabe zu simulieren:

val df = sc.parallelize(List(("dileep","gog","21","2016-01-01"), ("avishek","ganguly","21","2016-01-02"), ("shreyas","t","20","2016-01-03"))).toDF("firstName", "lastName", "age", "doj") 

Dann:

import org.apache.spark.sql.functions._ 

val temp = df.withColumn("doj", to_date('doj)) 
temp.registerTempTable("temptable"); 
val temp2 = sqlContext.sql("select * from temptable where doj > cast('2016-01-02' as date)") 

Dadurch könnte die eine temp2.show() wie erwartet enthüllt:

+---------+--------+---+----------+ 
|firstName|lastName|age|  doj| 
+---------+--------+---+----------+ 
| shreyas|  t| 20|2016-01-03| 
+---------+--------+---+----------+ 
+0

danke für den Vorschlag wird meine Frage mit komplettem Code und Erklärung zu aktualisieren – Dileep