Scala_Spark使用自定义函数,操作DataFrame

1.代码如下:

package spark_dataframe


import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions
import org.apache.spark.sql
object functionsdf extends App{
    override def main(args: Array[String]): Unit = {
        val spark = SparkSession.builder.appName("APP").master("local[*]").getOrCreate()
        val sc = spark.sparkContext
        val inputdf = spark.read.format("csv").option("header",true).load("/root/Github_files/python_All/Dataset/iris-data.csv")
        inputdf.show()
        def func1(x:Any,y:Any):Double ={
            return x.toString().toDouble * y.toString().toDouble
        }
        // import spark.implicits
        // import spark.sqlContext
        val func1_udf = functions.udf(func1(_:Any,_:Any),DoubleType)
        val func1_df1 = inputdf.withColumn("sepal-area",func1_udf(inputdf.col("sepal-length"),inputdf.col("sepal-width")))
        func1_df1.show()
        func1_df1.printSchema()
        val func1_df2 = func1_df1.withColumn("petal-area",func1_udf(func1_df1.col("petal-length"),func1_df1.col(" petal-width")))
        func1_df2.show()
        //other method defined udf_function
        
        val func3 =(x:Any,y:Any) =>{
            val sums = 2*(x.toString.toDouble) + 2*(y.toString.toDouble)
            sums.toDouble.toString()
        }
        val func3_udf = functions.udf(func3,StringType)

        /**     以下定义也可以实现
          *     val func3_udf = functions.udf(func3(_:Any,_:Any),StringType)
          */
        
        val func3_df3 = inputdf.withColumn("sepal-range",func3_udf(inputdf.col("sepal-length"),inputdf.col("sepal-width")))
        func3_df3.show()
        spark.stop()
        sc.stop()

    }
}

原始数据:inputdf.show()

使用函数计算之后,新增一列 func1_df1.show()

func1_df1的结构  : func1_df1.printSchema() ,显然这个petal-width字段的名字在左边存在空格,所以在定义func1_df2时对列名需要加上一个空格

 func1_df2.show():

func3_df3.show()

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值