2015-03-31 7 views
12

के साथ डेटाफ्रेम का उपयोग करना मान लें कि मेरे पास डेटाफ्रेम है (जिसे मैंने एचडीएफएस पर सीएसवी से पढ़ा है) और मैं इसे एमएलआईबीबी के माध्यम से कुछ एल्गोरिदम प्रशिक्षित करना चाहता हूं। मैं पंक्तियों को लेबल किए गए पॉइंट्स में कैसे परिवर्तित करूं या अन्यथा इस डेटासेट पर एमएललिब का उपयोग कैसे करूं?एमएलआईबी

+1

आप अपने कॉलम के डेटा प्रकार का उल्लेख नहीं किया है, लेकिन वे (पूर्णांक, डबल आदि) सांख्यिक आप उपयोग कर सकते हैं [VectorAssembler] कर रहे हैं (http: //spark.apache फीचर कॉलम को [वेक्टर] के एक कॉलम में बदलने के लिए .org/docs/latest/ml-features.html # vectorassembler) (http://spark.apache.org/docs/latest/mllib-data-types.html) । – Ben

उत्तर

5

आप यह मानते हुए स्काला का उपयोग कर रहे:

val results : DataFrame = sqlContext.sql(...) 

चरण 1:

मान लें कि आपका प्राप्त DataFrame इस प्रकार करते हैं फोन results.printSchema() - यह आपको बताएंगे कि न केवल में स्तंभों डेटाफ्रेम और (यह महत्वपूर्ण है) उनके आदेश, लेकिन स्पार्क एसक्यूएल सोचता है कि उनके प्रकार क्या हैं। एक बार जब आप यह आउटपुट देखते हैं तो चीजें बहुत कम रहस्यमय होती हैं।

चरण 2: एक RDD[Row]DataFrame से हट जाओ:

val rows: RDD[Row] = results.rdd 

चरण 3: अब खींच का मामला जो कुछ भी अलग-अलग पंक्तियों से बाहर ब्याज आप फ़ील्ड है। इसके लिए आपको प्रत्येक फ़ील्ड की 0-आधारित स्थिति और इसके प्रकार की जानकारी जाननी होगी, और सौभाग्य से आपने उपरोक्त चरण 1 में वह सब प्राप्त किया है। उदाहरण के लिए, मान लीजिए कि आप एक SELECT x, y, z, w FROM ... और स्कीमा मुद्रण किया जाने झुकेंगे

root 
|-- x double (nullable = ...) 
|-- y string (nullable = ...) 
|-- z integer (nullable = ...) 
|-- w binary (nullable = ...) 

और सब आप x और z उपयोग करना चाहता था मान लीजिए। यहाँ से

rows.map(row => { 
    // x has position 0 and type double 
    // z has position 2 and type integer 
    (row.getDouble(0), row.getInt(2)) 
}) 

तुम सिर्फ प्रासंगिक MLlib वस्तुओं को बनाने के कोर स्पार्क का उपयोग करें: आप उन्हें इस प्रकार एक RDD[(Double, Integer)] में बाहर खींच सकते हैं। यदि आपके एसक्यूएल सरणी प्रकार के कॉलम लौटाता है, तो चीजें थोड़ा और जटिल हो सकती हैं, इस मामले में आपको उस कॉलम के लिए getList(...) पर कॉल करना होगा।

2

आप जावा का उपयोग कर रहे मानते हुए (स्पार्क संस्करण 1.6.2): ​​

यहाँ मशीन सीखने के लिए DataFrame का उपयोग कर जावा कोड का एक सरल उदाहरण है।

  • यह निम्न संरचना के साथ एक JSON लोड करता है,

    [{ "लेबल": 1, "att2": 5.037089672359123, "att1": 2.4100883023159456} ...]

  • प्रशिक्षण और परीक्षण में डेटा,

  • ट्रेन मॉडल ट्रेन डेटा का उपयोग कर,
  • परीक्षण डाटा को मॉडल लागू करते हैं और
  • stor विभाजन परिणाम के रूप में।

इसके अलावा official documentation के अनुसार वर्तमान संस्करण 2.0.0 के बाद से एमएलआईबीबी के लिए "डेटाफ्रेम-आधारित एपीआई प्राथमिक API" है। तो आप डेटाफ्रेम का उपयोग करके कई उदाहरण पा सकते हैं।

कोड:

SparkConf conf = new SparkConf().setAppName("MyApp").setMaster("local[2]"); 
SparkContext sc = new SparkContext(conf); 
String path = "F:\\SparkApp\\test.json"; 
String outputPath = "F:\\SparkApp\\justTest"; 

System.setProperty("hadoop.home.dir", "C:\\winutils\\"); 

SQLContext sqlContext = new org.apache.spark.sql.SQLContext(sc); 

DataFrame df = sqlContext.read().json(path); 
df.registerTempTable("tmp"); 
DataFrame newDF = df.sqlContext().sql("SELECT att1, att2, label FROM tmp"); 
DataFrame dataFixed = newDF.withColumn("label", newDF.col("label").cast("Double")); 

VectorAssembler assembler = new VectorAssembler().setInputCols(new String[]{"att1", "att2"}).setOutputCol("features"); 
StringIndexer indexer = new StringIndexer().setInputCol("label").setOutputCol("labelIndexed"); 

// Split the data into training and test 
DataFrame[] splits = dataFixed.randomSplit(new double[] {0.7, 0.3}); 
DataFrame trainingData = splits[0]; 
DataFrame testData = splits[1]; 

DecisionTreeClassifier dt = new DecisionTreeClassifier().setLabelCol("labelIndexed").setFeaturesCol("features"); 
Pipeline pipeline = new Pipeline().setStages(new PipelineStage[] {assembler, indexer, dt}); 
// Train model 
PipelineModel model = pipeline.fit(trainingData); 

// Make predictions 
DataFrame predictions = model.transform(testData); 
predictions.rdd().coalesce(1,true,null).saveAsTextFile("justPlay.txt" +System.currentTimeMillis());