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

參見: