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)