Как получить имя Spark Column как String? - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу написать метод для округления числового столбца без выполнения чего-то вроде:

df
.select(round($"x",2).as("x"))

Поэтому мне нужно иметь многоразовое выражение-столбец, например:

def roundKeepName(c:Column,scale:Int) = round(c,scale).as(c.name)

К сожалениюc.name не существует, поэтому приведенный выше код не компилируется.Я нашел решение для ColumName:

 def roundKeepName(c:ColumnName,scale:Int) = round(c,scale).as(c.string.name)

Но как я могу это сделать с Column (который генерируется, если я использую col("x") вместо $"x")

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Не уверен, что вопрос действительно был дан ответ.Ваша функция может быть реализована следующим образом (toString возвращает имя столбца):

def roundKeepname(c:Column,scale:Int) = round(c,scale).as(c.toString)

Если вам не нравится полагаться на toString, вот более надежная версия.Вы можете положиться на базовое выражение, привести его к выражению NamedExpression и взять его имя.

import org.apache.spark.sql.catalyst.expressions.NamedExpression
def roundKeepname(c:Column,scale:Int) = 
    c.expr.asInstanceOf[NamedExpression].name

И это работает:

scala> spark.range(2).select(roundKeepname('id, 2)).show
+---+
| id|
+---+
|  0|
|  1|
+---+  
0 голосов
/ 26 ноября 2018

Обновление:

С помощью способа решения, заданного BlueSheepToken, вот как вы можете сделать это динамически, если у вас есть все «двойные» столбцы.

scala> val df = Seq((1.22,4.34,8.93),(3.44,12.66,17.44),(5.66,9.35,6.54)).toDF("x","y","z")
df: org.apache.spark.sql.DataFrame = [x: double, y: double ... 1 more field]

scala> df.show
+----+-----+-----+
|   x|    y|    z|
+----+-----+-----+
|1.22| 4.34| 8.93|
|3.44|12.66|17.44|
|5.66| 9.35| 6.54|
+----+-----+-----+


scala>  df.columns.foldLeft(df)( (acc,p)  => (acc.withColumn(p+"_t",round(col(p),1)).drop(p).withColumnRenamed(p+"_t",p))).show
+---+----+----+
|  x|   y|   z|
+---+----+----+
|1.2| 4.3| 8.9|
|3.4|12.7|17.4|
|5.7| 9.4| 6.5|
+---+----+----+


scala>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...