Подтвердить что ты не робот

Возможно ли псевдоним столбцов программно в искровом sql?

В искрах SQL (возможно, только HiveQL) можно сделать:

select sex, avg(age) as avg_age
from humans
group by sex

что приведет к DataFrame с столбцами с именем "sex" и "avg_age".

Как avg(age) можно сгладить до "avg_age" без использования текстового SQL?

Edit: После ответа zero323 мне нужно добавить ограничение, которое:

Имя, подлежащее переименованию, может быть неизвестно/гарантировано или даже адресовано. В текстовом SQL, используя "select EXPR as NAME", удаляется требование иметь промежуточное имя для EXPR. Это также имеет место в приведенном выше примере, где "avg (age)" может получить множество автогенерированных имен (которые также различаются между искровыми релизами и базами sql-context).

4b9b3361

Ответ 1

Предположим, что human_df является DataFrame для людей. Поскольку Spark 1.3:

human_df.groupBy("sex").agg(avg("age").alias("avg_age"))

Ответ 2

Если вы предпочитаете переименовывать один столбец, можно использовать метод withColumnRenamed:

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

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

В качестве альтернативы вы можете использовать метод alias:

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

df.select(avg($"age").alias("average_age")) 

Вы можете взять его с небольшим помощником:

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")))

Ответ 3

Выключается 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"

Ответ 4

Анонимные столбцы, такие как те, которые будут сгенерированы с помощью avg(age) без AS avg_age, получают автоматически назначенные имена. Как вы указываете в своем вопросе, имена специфичны для реализации, генерируемые стратегией именования. При необходимости вы можете написать код, который обнюхивает среду и создает соответствующую стратегию поиска и переименования, основанную на конкретной стратегии именования. Их не так много.

В Spark 1.4.1 с HiveContext формат "_cN", где N - позиция анонимного столбца в таблице. В вашем случае имя будет _c1.