是否可以在spark sql中以编程方式对列进行别名?

Pri*_*NAI 20 scala apache-spark apache-spark-sql

在spark SQL(也许只有HiveQL)中,可以做到:

select sex, avg(age) as avg_age
from humans
group by sex
Run Code Online (Sandbox Code Playgroud)

这将导致一个DataFrame名为"sex"和列的列"avg_age".

如何avg(age)"avg_age"不使用文本SQL的情况下使用别名?

编辑: 在零点323的回答之后,我需要添加以下约束:

要重命名的列的名称可能不知道/保证甚至无法寻址.在文本SQL中,使用"选择EXPR作为名称"不需要具有EXPR的中间名称.在上面的示例中也是如此,其中"avg(age)"可以获得各种自动生成的名称(在spark发布和sql-context后端之间也有所不同).

小智 32

我们假设human_df是人类的DataFrame.自Spark 1.3起:

human_df.groupBy("sex").agg(avg("age").alias("avg_age"))
Run Code Online (Sandbox Code Playgroud)


zer*_*323 17

如果您希望重命名单个列,则可以使用以下withColumnRenamed方法:

case class Person(name: String, age: Int)

val df = sqlContext.createDataFrame(
    Person("Alice", 2) :: Person("Bob", 5) :: Nil) 
df.withColumnRenamed("name", "first_name")
Run Code Online (Sandbox Code Playgroud)

或者你可以使用alias方法:

import org.apache.spark.sql.functions.avg

df.select(avg($"age").alias("average_age")) 
Run Code Online (Sandbox Code Playgroud)

你可以用小帮手进一步做到:

import org.apache.spark.sql.Column

def normalizeName(c: Column) = {
  val pattern = "\\W+".r
  c.alias(pattern.replaceAllIn(c.toString, "_"))
}

df.select(normalizeName(avg($"age")))
Run Code Online (Sandbox Code Playgroud)


Pri*_*NAI 10

事实证明def toDF(colNames: String*): DataFrame确实如此.粘贴2.11.7文档:

def toDF(colNames: String*): DataFrame

Returns a new DataFrame with columns renamed. This can be quite
convenient in conversion from a RDD of tuples into a DataFrame
with meaningful names. For example:

    val rdd: RDD[(Int, String)] = ...
    rdd.toDF()  // this implicit conversion creates a DataFrame
                // with column name _1 and _2
    rdd.toDF("id", "name")  // this creates a DataFrame with
                            // column name "id" and "name"
Run Code Online (Sandbox Code Playgroud)