将sparkDataframe中的值限制为仅指定的值

13z8s7eq  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(234)

我的spark数据框如下

+-----+------+-----------+
|col_1| col_2|      col_3|
+-----+------+-----------+
|  abc|   123|    Allowed|
|dasdj|  null|Not-Allowed|
|  dce|   786|      wrong|
| null| 23456|Not-Allowed|
|  def|682364|       temp|
|  bcr|   786|Not-Allowed|
+-----+------+-----------+

我的要求是创建一个新列并捕获 col_1 以及 col_2 并捕获 col_3 值,并替换 col_3 默认值无效(“不允许”)
issue列包含 col_1 , col_2 , col_3 如果 col_1 或者 col_2 为null或 col_3 除了允许和不允许之外。
连接之后,我要更新 col_3 默认值为“不允许”。
我的预期产出:

+-----+------+-----------+------------------+
|col_1| col_2|      col_3|             issue|
+-----+------+-----------+------------------+
|  abc|   123|    Allowed|              null|
|dasdj|  null|Not-Allowed|dasdj,,Not-Allowed|
|  dce|   786|Not-Allowed|     dce,786,wrong|
| null| 23456|Not-Allowed|,23456,Not-Allowed|
|  def|682364|Not-Allowed|   def,682364,temp|
|  bcr|   786|Not-Allowed|              null|
+-----+------+-----------+------------------+

如果有人能给我建议一个实现这一目标的方法,我会很感激吗?

j1dl9f46

j1dl9f461#

你可以用 when 函数来检查 col_1 或者 col_2 为空或 col_3 与允许/不允许的值不同,然后在列中输入:

val df1 = df.withColumn(
    "issue",
    when(
      $"col_1".isNull || $"col_2".isNull || !$"col_3".isin("Allowed", "Not-Allowed"),
      concat_ws(
        ",",
        coalesce($"col_1", lit("")),
        coalesce($"col_2", lit("")),
        $"col_3"
      )
    )
  ).withColumn(
    "col_3",
    when(!$"col_3".isin("Allowed", "Not-Allowed"), "Not-Allowed").otherwise($"col_3")
  )

df1.show
//+-----+------+-----------+------------------+
//|col_1| col_2|      col_3|             issue|
//+-----+------+-----------+------------------+
//|  abc|   123|    Allowed|              null|
//|dasdj|  null|Not-Allowed|dasdj,,Not-Allowed|
//|  dce|   786|Not-Allowed|     dce,786,wrong|
//| null| 23456|Not-Allowed|,23456,Not-Allowed|
//|  def|682364|Not-Allowed|   def,682364,temp|
//|  bcr|   786|Not-Allowed|              null|
//+-----+------+-----------+------------------+

更新列的步骤 col_3 使用默认值 Not-Allowed ,则使用与 when 功能。

相关问题