【问题标题】:Convert an Rows or Columns to a dataframe将行或列转换为数据框
【发布时间】:2015-11-16 00:07:29
【问题描述】:

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

  userData1.select(userData1("job"))

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

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

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

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

那么行呢?例如:

  userData1.head(5)

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

【问题讨论】:

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


    【解决方案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|
    ## +---+---+
    

    要限制行数而不收集,可以使用limit方法:

    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|
    //  +---+---+---+
    

    【讨论】:

      猜你喜欢
      • 2017-10-17
      • 1970-01-01
      • 2016-02-14
      • 2016-02-17
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 2020-04-15
      相关资源
      最近更新 更多