spark-conditinal语句

r8xiu3jd  于 2021-06-01  发布在  Hadoop
关注(0)|答案(3)|浏览(158)

我选两个 Column 来自Dataframe的 col1 以及 col2 .

df.select((col("a")+col("b")).as("sum_col")

现在用户想要这个 sum_col 固定间距为4。因此,长度 a 以及 b 因此最大值可以小于100(2)或大于100(3),所以需要有条件地添加1或2个空格。
有人能告诉我怎么处理吗 select 用逻辑块来投射 Columnconcat 并决定添加一个或两个空格

k2arahey

k2arahey1#

只是使用 format_string 功能

import org.apache.spark.sql.functions.format_string

val df = Seq(1, 10, 100).toDF("sum_col")
val result = df.withColumn("sum_col_fmt", format_string("%4d", $"sum_col"))

并证明其有效:

result.withColumn("proof", concat(lit("'"), $"sum_col_fmt", lit("'"))).show
// +-------+-----------+------+
// |sum_col|sum_col_fmt| proof|
// +-------+-----------+------+
// |      1|          1|'   1'|
//|     10|         10|'  10'|
// |    100|        100|' 100'|
// +-------+-----------+------+
kx1ctssn

kx1ctssn2#

定义一个自定义项,然后注册它。我在格式前面加了一个点,这样可以在输出中显示出来。看看这个

scala> import org.apache.spark.sql.functions._
import org.apache.spark.sql.functions._

scala> val df = spark.range(1,20).toDF("col1")
df: org.apache.spark.sql.DataFrame = [col1: bigint]

scala>  val df2 = df.withColumn("newcol", 'col1 + 'col1)
df2: org.apache.spark.sql.DataFrame = [col1: bigint, newcol: bigint]

scala> def myPadding(a:String):String =
     | return ".%4s".format(a)
myPadding: (a: String)String

scala> val myUDFPad = udf( myPadding(_:String):String)
myUDFPad: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,StringType,Some(List(StringType)))

scala> df2.select(myUDFPad(df2("newcol"))).show
+-----------+
|UDF(newcol)|
+-----------+
|      .   2|
|      .   4|
|      .   6|
|      .   8|
|      .  10|
|      .  12|
|      .  14|
|      .  16|
|      .  18|
|      .  20|
|      .  22|
|      .  24|
|      .  26|
|      .  28|
|      .  30|
|      .  32|
|      .  34|
|      .  36|
|      .  38|
+-----------+

scala>
ozxc1zmp

ozxc1zmp3#

带string.format的自定义项:

val df = List((1, 2)).toDF("a", "b")

val leadingZeroes = (value: Integer) => String.format("%04d", value)
val leadingZeroesUDF = udf(leadingZeroes)

val result = df.withColumn("sum_col", leadingZeroesUDF($"a" + $"b"))

result.show(false)

输出:

+---+---+-------+
|a  |b  |sum_col|
+---+---+-------+
|1  |2  |0003   |
+---+---+-------+

相关问题