2015-11-16 57 views
3

我知道我可以提取列如下:转换的行或列的数据帧

userData1.select(userData1("job")) 

但是如果我已经有一列或多列的一个阵列,我如何得到一个数据框出来的它?什么工作对我来说,到目前为止是:

userData1.select(userData1("id"), userData1("age")) 

这是一个有点冗长和丑陋相比,在R中可以做什么:

userData1[, c("id", "age")] 

又是怎么回事行?例如:

userData1.head(5) 

如何将其转换为新的数据框?

回答

1

选择多列,你可以使用可变参数的语法:

import org.apache.spark.sql.DataFrame 

val df: DataFrame = sc.parallelize(Seq(
    (1, "x", 2.0), (2, "y", 3.0), (3, "z", 4.0) 
)).toDF("foo", "bar", "baz") 


// or df.select(Seq("foo", "baz") map col: _*) 
val fooAndBaz: DataFrame = df.select(Seq($"foo", $"baz"): _*) 
fooAndBaz.show 

// +---+---+ 
// |foo|baz| 
// +---+---+ 
// | 1|2.0| 
// | 2|3.0| 
// | 3|4.0| 
// +---+---+ 

PySpark等效参数拆包:

df = sqlContext.createDataFrame(
    [(1, "x", 2.0), (2, "y", 3.0), (3, "z", 4.0)], 
    ("foo", "bar", "baz")) 

df.select(*["foo", "baz"]).show() 

## +---+---+ 
## |foo|baz| 
## +---+---+ 
## | 1|2.0| 
## | 2|3.0| 
## | 3|4.0| 
## +---+---+ 

要限制行数不收取你可以使用限制方法:

val firstTwo: DataFrame = df.limit(2) 
firstTwo.show 

// +---+---+---+ 
// |foo|bar|baz| 
// +---+---+---+ 
// | 1| x|2.0| 
// | 2| y|3.0| 
// +---+---+---+ 

这相当于SQL LIMIT子句:

df.registerTempTable("df") 
sqlContext.sql("SELECT * FROM df LIMIT 2").show 

// +---+---+---+ 
// |foo|bar|baz| 
// +---+---+---+ 
// | 1| x|2.0| 
// | 2| y|3.0| 
// +---+---+---+