将行或列转换为数据帧

时间:2015-11-16 00:07:29

标签: scala apache-spark apache-spark-sql data-manipulation

我知道我可以提取这样的列:

  userData1.select(userData1("job"))

但是,如果我已经有一个列或列数组,如何从中获取数据帧呢?到目前为止对我有用的是:

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

与你在R中所做的相比,这有点冗长和丑陋:

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

行怎么样?例如:

  userData1.head(5)

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

1 个答案:

答案 0 :(得分:1)

要选择多个列,您可以使用varargs语法:

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|
//  +---+---+---+
相关问题