我想编写一个方法来舍入数字列而不执行以下操作:
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")
您的函数可以像这样实现(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 |
+---+
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。