将函数应用于Spark Dataframe Column

时间:2016-02-05 15:19:26

标签: scala apache-spark dataframe apache-spark-sql user-defined-functions

来自R,我习惯于轻松地对列进行操作。有没有简单的方法可以使用我在scala中编写的这个函数

def round_tenths_place( un_rounded:Double ) : Double = {
    val rounded = BigDecimal(un_rounded).setScale(1, BigDecimal.RoundingMode.HALF_UP).toDouble
    return rounded
}

并将其应用于数据框的一列 - 我希望这样做:

 bid_results.withColumn("bid_price_bucket", round_tenths_place(bid_results("bid_price")) )

我没有找到任何简单的方法,我正在努力弄清楚如何做到这一点。必须有一种比将数据帧转换为RDD更简单的方法,然后从行的rdd中选择以获得正确的字段并将函数映射到所有值,是吗?还有一些更简洁的创建SQL表,然后使用sparkSQL UDF执行此操作?

1 个答案:

答案 0 :(得分:15)

您可以按如下方式定义UDF:

val round_tenths_place_udf = udf(round_tenths_place _)
bid_results.withColumn(
  "bid_price_bucket", val round_tenths_place_udf($"bid_price"))

虽然内置Round expression使用与您的函数完全相同的逻辑,但应该绰绰有余,更不用说效率更高了:

import org.apache.spark.sql.functions.round

bid_results.withColumn("bid_price_bucket", round($"bid_price", 1))

另见: