在Spark Scala中合并

问题描述

我试图了解Spark中是否有方法-scala在合并中包含空字符串。

Ex-我有下面的DF-

 val df2=Seq(
 ("","1"),("null","15_20")
 )toDF("c1","c2")

+----+-----+
|  c1|   c2|
+----+-----+
|    |    1|
|null|15_20|
+----+-----+

以下代码仅适用于NULL值。但是我也要求合并也要为空字符串工作。

df2.withColumn("FirstNonNullOrBlank",coalesce(col("c1"),col("c2")))show
+----+-----+-------------------+
|  c1|   c2|FirstNonNullOrBlank|
+----+-----+-------------------+
|    |    1|                   |
|null|15_20|              15_20|
+----+-----+-------------------+

预期输出-

+----+-----+-------------------+
|  c1|   c2|FirstNonNullOrBlank|
+----+-----+-------------------+
|    |    1|              1    |
|null|15_20|              15_20|
+----+-----+-------------------+

这里最好的方法是什么?

解决方法

您需要一个辅助函数来“无效化”这些记录:

def nullify(c: Column) = when(not (c==="" or c==="null"),c)

df2
  .withColumn("FirstNonNullOrBlank",coalesce(
    nullify(col("c1")),nullify(col("c2")))
  )
  .show

+----+-----+-------------------+
|  c1|   c2|FirstNonNullOrBlank|
+----+-----+-------------------+
|    |    1|                  1|
|null|15_20|              15_20|
+----+-----+-------------------+

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...