2016-12-05 69 views
1

我已經使用sqlContext創建了要讀取csv文件的數據框,我需要將表列轉換爲RDD,然後使用密集的Vector來執行矩陣乘法。 我發現很難這樣做。如何使用sql上下文將數據框轉換爲RDD

val df = sqlContext.read 
    .format("com.databricks.spark.csv") 
    .option("header","true") 
    .option("inferSchema","true") 
    .load("/home/project/SparkRead/train.csv") 

val result1 = sqlContext.sql("SELECT Sales from train").rdd 

如何將其轉換爲密載體?

+1

您可以添加DataFrame的模式嗎? – eliasah

+0

@eliasah 模式: – Freeman

+0

@eliasah 模式: 根 | - 存儲:整數(可爲空=真) | - 工作日:整數(可爲空=真) | - 日期:date(可爲空= true) | - 銷售:整數(可空值= true) | - 客戶:整數(可空值= true) | - 開放:整數(可空值= true) | - 促銷:integer(nullable = true) | - StateHoliday:integer(nullable = true) | - SchoolHoliday:integer(nullable = true) – Freeman

回答

0

您可以使用VectorAssemblerDataframe轉換爲Vector。請查看下面的代碼:

val df = spark.read. 
    format("com.databricks.spark.csv"). 
    option("header","true"). 
    option("inferSchema","true"). 
    load("/tmp/train.csv") 

// assuming input 
// a,b,c,d 
// 1,2,3,4 
// 1,1,2,3 
// 1,3,4,5 

import org.apache.spark.ml.feature.VectorAssembler 
import org.apache.spark.ml.linalg.Vectors 

val assembler = new VectorAssembler(). 
    setInputCols(Array("a", "b", "c", "d")). 
    setOutputCol("vect") 

val output = assembler.transform(df) 

// show the result 
output.show() 

// +---+---+---+---+-----------------+ 
// | a| b| c| d|    vect| 
// +---+---+---+---+-----------------+ 
// | 1| 2| 3| 4|[1.0,2.0,3.0,4.0]| 
// | 1| 1| 2| 3|[1.0,1.0,2.0,3.0]| 
// | 1| 3| 4| 5|[1.0,3.0,4.0,5.0]| 
// +---+---+---+---+-----------------+