4

从R开始,我习惯于轻松地对列进行操作。有没有简单的方法来利用这个功能,我已经用Scala编写将函数应用于Spark Dataframe Column

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来做这件事?

+0

http://stackoverflow.com/questions/29109916/updating-a-dataframe-column-in-spark –

回答

11

可以如下定义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)) 

参见: