利用lit和typeLit为spark dataframe增加常量列 & udf函数传入额外参数

有时候由于数据处理需要,我们会为dataframe添加一个常量列,本文介绍向dataframe添加常量列的方法。

使用typedLit函数添加复合类型常量列

通过函数:org.apache.spark.sql.functions.typedLit,可以添加List,Seq和Map类型的常量列。

scala> val df1 = sc.parallelize(Seq("Hello", "world")).toDF()
df1: org.apache.spark.sql.DataFrame = [value: string]

scala> df1.withColumn("some_array", typedLit(Seq(7, 8, 9))).show()
+-----+----------+
|value|some_array|
+-----+----------+
|Hello| [7, 8, 9]|
|world| [7, 8, 9]|
+-----+----------+

scala> df1.withColumn("some_struct", typedLit(("teststring", 1, 0.3))).show(false)
+-----+--------------------+
|value|some_struct         |
+-----+--------------------+
|Hello|[teststring, 1, 0.3]|
|world|[teststring, 1, 0.3]|
+-----+--------------------+

scala> df1.withColumn("data_map", typedLit(Map("k1" -> 1, "k2" -> 2))).show(false)
+-----+------------------+
|value|data_map          |
+-----+------------------+
|Hello|[k1 -> 1, k2 -> 2]|
|world|[k1 -> 1, k2 -> 2]|
+-----+------------------+

使用lit函数来添加简单类型常量列

可以通过函数:org.apache.spark.sql.functions.lit来添加简单类型(string,int,float,long,等)的常量列。

scala> df1.withColumn("data_map", lit("teststring")).show(false)
+-----+----------+
|value|data_map  |
+-----+----------+
|Hello|teststring|
|world|teststring|
+-----+----------+

利用lit或者typedLit函数向spark udf函数传入额外参数

1 定义带额外参数的udf函数

 val extract = udf{(params:String, field_name:String)=>
     val obj = JSON.parseObject(params)
     obj.getString(field_name)
  }

该函数中,params参数是常规的 spark dataframe 中的列,而 field_name 参数是需要额外向函数传入的非列参数,我们需要借助它完成我们的函数逻辑。

2 使用带额外参数的 udf函数

    es_data
      .withColumn("dms1", extract(col("params"),lit("dms1")))
      .withColumn("dms2", extract(col("params"),lit("dms2")))

在这段代码中,params字段列是一个json字符串

样例值

{"dms1":"v1","dms2":"v2"}

我们实现了从params列中解析我们需要的dms1值和dms2值,并形成我们的dms1,dms2新列。我们知道在自定义udf函数时,每个参数一般都是dataframe中真实存在的列。

此处在调用我们定义的extract udf函数时,我们借助lit函数向udf中传入了dms1, dms2的字符串实参,若没有lit和typeLit是无法实现该功能的。

小结

本文介绍了spark sql 的lit和typeList函数的用途。主要有

1 可以生成dataframe的常量列

2 可以为自定义udf函数传入额外的非列参数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值