искра - условные выражения внутри выбора - PullRequest
0 голосов
/ 04 октября 2018

Я выбираю два Column s из Dataframe col1 и col2.

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

. Теперь пользователь хочет, чтобы это sum_col было фиксированным пробелом до 4., поэтому длина aи b равно 2, следовательно, максимальное значение может составлять менее 100 (двух) или более 100 (трех), поэтому необходимо сделать это условно, чтобы добавить с ним 1 или 2 пробела.

может кто-нибудь сказать мне, какобрабатывать в блоке select cinditional логику для приведения Column к concat и определять одно или два пробела для добавления

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Определите UDF и затем зарегистрируйте его.Я добавил точку перед форматом, чтобы ее можно было показать в выводе.Проверьте это

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>
0 голосов
/ 04 октября 2018

Просто используйте 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'|
// +-------+-----------+------+
0 голосов
/ 04 октября 2018

UDF со строковым форматом:

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   |
+---+---+-------+
...