2016-07-18 13 views
-1

ich habe eine CSV von sowohl text und numerische daten. Ich muss es in Feature-Vektordaten in Spark konvertieren (doppelte Werte). Gibt es eine Möglichkeit, das zu tun?wie mix aus text und numerische daten in feature daten in apache spark

Ich sehe einige z. B. wo jedes Schlüsselwort auf einen doppelten Wert zugeordnet ist und verwenden Sie dies zum Konvertieren. Wenn es jedoch mehrere Schlüsselwörter gibt, ist es schwierig, dies zu tun.

Gibt es einen anderen Ausweg? Ich sehe Spark stellt Extraktoren zur Verfügung, die in Feature-Vektoren konvertieren werden. Könnte jemand bitte ein Beispiel geben?

48, Private, 105808, 9th, 5, Widowed, Transport-moving, Unmarried, White, Male, 0, 0, 40, United-States, >50K 
42, Private, 169995, Some-college, 10, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 0, 45, United-States, <=50K 
+0

haben Sie überprüfen [funken csv] (https://github.com/databricks/spark-csv) –

+0

ein Blick auf die StringIndexer Haben (ML ist erlaubt, oder sind Sie streng MLLIB?) http : //spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.ml.feature.StringIndexer – WillemM

+0

Ich bevorzuge MLLIB api wenn –

Antwort

0

Endlich habe ich diesen Weg gemacht. Ich iteriere durch alle Daten und mache eine Karte mit Schlüssel als jedes Element und inkrementiere einen Doppelzähler.

def createMap(data: RDD[String]) : Map[String,Double] = { 
var mapData:Map[String,Double] = Map() 
var counter = 0.0 
data.collect().foreach{ item => 
    counter = counter +1 
    mapData += (item -> counter) 
} 
mapData 
} 

def getLablelValue(input: String): Int = input match { 
case "<=50K" => 0 
case ">50K" => 1 
} 


val census = sc.textFile("/user/cloudera/census_data.txt") 
val orgTypeRdd = census.map(line => line.split(", ")(1)).distinct 
val gradeTypeRdd = census.map(line => line.split(", ")(3)).distinct 
val marStatusRdd = census.map(line => line.split(", ")(5)).distinct 
val jobTypeRdd = census.map(line => line.split(", ")(6)).distinct 
val familyStatusRdd = census.map(line => line.split(", ")(7)).distinct 
val raceTypeRdd = census.map(line => line.split(", ")(8)).distinct 
val genderTypeRdd = census.map(line => line.split(", ")(9)).distinct 
val countryRdd = census.map(line => line.split(", ")(13)).distinct 
val salaryRange = census.map(line => line.split(", ")(14)).distinct 

val orgTypeMap = createMap(orgTypeRdd) 
val gradeTypeMap = createMap(gradeTypeRdd) 
val marStatusMap = createMap(marStatusRdd) 
val jobTypeMap = createMap(jobTypeRdd) 
val familyStatusMap = createMap(familyStatusRdd) 
val raceTypeMap = createMap(raceTypeRdd) 
val genderTypeMap = createMap(genderTypeRdd) 
val countryMap = createMap(countryRdd) 
val salaryRangeMap = createMap(salaryRange) 


val featureVector = census.map{line => 
    val fields = line.split(", ") 
LabeledPoint(getLablelValue(fields(14).toString) , Vectors.dense(fields(0).toDouble, orgTypeMap(fields(1).toString) , fields(2).toDouble , gradeTypeMap(fields(3).toString) , fields(4).toDouble , marStatusMap(fields(5).toString), jobTypeMap(fields(6).toString), familyStatusMap(fields(7).toString),raceTypeMap(fields(8).toString),genderTypeMap (fields(9).toString), fields(10).toDouble , fields(11).toDouble , fields(12).toDouble,countryMap(fields(13).toString) , salaryRangeMap(fields(14).toString))) 
}