来自
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来做到这一点?
您可以按如下方式定义 UDF:
val round_tenths_place_udf = udf(round_tenths_place _)
bid_results.withColumn(
"bid_price_bucket", round_tenths_place_udf($"bid_price"))
尽管内置Round
表达式使用的逻辑与您的函数完全相同,并且应该绰绰有余,更不用说效率更高了:
import org.apache.spark.sql.functions.round
bid_results.withColumn("bid_price_bucket", round($"bid_price", 1))
另请参阅以下内容:
- 在 Spark 中更新数据帧列
- 如何将函数应用于 Spark 数据帧的列?