2016-03-22 41 views
0

我知道有幾個問題已經提出了類似的主題,但我無法對我的問題應用任何答案,也想知道最佳實踐。將數據集從SQL轉換爲RDD [矢量]

我已經將ML的日期集加載到SQL數據庫。我想根據它應用mllib的聚類功能。我已經使用sqlContext將SQL數據庫加載到DataFrame,刪除了不相關的列。然後發生問題的部分,我通過解析DataFrame的每一行來創建一個向量。 然後使用toJavaRDD函數將矢量轉換爲RDD。

下面是代碼(作品):

val usersDF = sqlContext.read.format("jdbc").option("url","jdbc:mysql://localhost/database"). 
    option("driver","com.mysql.jdbc.Driver").option("dbtable","table"). 
    option("user","woot").option("password","woot-password").load() 

val cleanDF = usersDF.drop("id").drop("username") 
cleanDF.show() 

val parsedData = cleanDF.map(s => Vectors.dense(s.toString().replaceAll("[\\[\\]]", "").trim.split(',').map(_.toDouble))).cache() 

val splits = parsedData.randomSplit(Array(0.6,0.4), seed = 11L) 
val train_set = splits(0).cache() 

val gmm = new GaussianMixture().setK(2).run(train_set) 

我的主要問題問候我的火花文檔閱讀:Local vector,在我的理解數據幀映射將在工人執行,以後會在創建Vector時發送給驅動程序(是否是本地向量的含義)才能稍後再次發送給工人?有沒有更好的方法來實現這一目標?

另一件事是,將SQL加載到DataFrame中僅將其轉換爲字符串並再次解析它似乎有點奇怪。有沒有其他的最佳實踐建議?

回答

0

link你建議

本地矢量具有整數類型的和基於索引0和雙輸入 值,存儲在單臺機器上。 MLlib支持兩種類型的本地向量:密集和稀疏。

分佈式矩陣具有長型的行和列索引以及分佈式存儲在一個或多個RDD中的雙重類型的值。

當地的載體表現得像個你會用你的RDD(字符串,整數數組)的任何對象,他們創建和一臺機器,工作節點上存儲,只有當你收集他們他們將被髮送到驅動程序節點。

如果考慮大小2n將其存儲分佈式你會在長度nx1x2(x = x1::x2)兩個半區分開它的向量x。要使用另一個矢量y執行點積,工作人員將執行r1=x1*y1(在機器1上)和r2=x2*y2(在機器2上),然後您需要將給出r=r1+r2的部分結果進行分組。你的向量x是分佈式的,向量x1x2也是局部向量。如果您有x作爲本地向量,那麼您可以在一個步驟中在工作節點r=x*y上執行。

對於第二個問題,我不明白爲什麼要以SQL格式存儲矢量。擁有這樣的CSV文件就足夠了:

label feature1 feature2 ... 
1, 0.5,  1.2  ... 
0, 0.2,  0.5  ...