2016-12-05 65 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]| 
// +---+---+---+---+-----------------+