【问题标题】:Spark - How to take logarithm of every value minus smallest element in a columnSpark - 如何取每个值的对数减去列中的最小元素
【发布时间】:2018-01-04 04:21:44
【问题描述】:

我想取每个值减去列中最小元素的对数。例如,如果 a 有这样的列:

分数:1000、500、1200、300

那我想要:

logged_score:log(700)、log(200)、log(900)、log(0)

我在 Spark 数据框中尝试过:

.select(log($"score" - min($"score")).alias("logged_score"))

但是我收到了这个错误:

线程“主”org.apache.spark.sql.AnalysisException 中的异常: 分组表达式序列为空,并且 'score' 不是 聚合函数。换行 '(LOG((score - min(score))) AS logged_score)' 在窗口函数中或包装 'score' 在 first() (或 first_value) 如果您不在乎获得哪个值。;;

解决这个问题的最简单方法是在获取日志值之前收集min($"score")。但是,如果有更好的解决方案,我会尽量避免在这里收集。

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    您可以简单地执行以下操作

    import org.apache.spark.sql.functions._
    val minimumValue = df.select(min("score")).first()(0)
    df.withColumn("logged_score", log($"score" - lit(minimumValue))).na.fill(0).show()
    

    【讨论】:

    • 谢谢,这行得通。我使用与选择类似的方法。还有一个问题,为什么在第三行使用 lit ?即使没有点亮它似乎也能正常工作。
    • 我只是希望两者都是列类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2016-07-12
    • 1970-01-01
    相关资源
    最近更新 更多