开发者社区> 问答> 正文

如何将Spark列的名称作为String?

我想编写一个方法来舍入数字列而不执行以下操作:

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

展开
收起
社区小助手 2018-12-06 15:16:45 1714 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    您的函数可以像这样实现(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

    +---+

    2019-07-17 23:18:33
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Hybrid Cloud and Apache Spark 立即下载
Scalable Deep Learning on Spark 立即下载
Comparison of Spark SQL with Hive 立即下载

相关实验场景

更多