如何使用Scala在ApacheSpark中用空字符串(“”)替换空值[复制]

relj7zay  于 2022-11-09  发布在  Scala
关注(0)|答案(2)|浏览(132)

这个问题在这里已经有答案

Spark column string replace when present in other column (row)(2个答案)
五年前就关门了。
我正在与Scala(除一个字段外,其余331个可以为空)大约1000万条记录的大型数据集(包含332个字段)的ApacheSpark中工作。但我想用空字符串(“”)替换NULL。由于我有大量的字段,实现这一目标的最佳方式是什么?我希望在导入此数据集时处理空值,这样在执行转换或导出到DF时将是安全的。我已经创建了包含332个字段的Case类,处理这些空值的最佳方式是什么?我可以使用选项(Field).getOrElse(“”),但我想这不是最好的方法,因为我有大量的字段。谢谢你!

ohfgkhjo

ohfgkhjo1#

我们可以使用udf获得如下所示的安全列

val df = Seq((1,"Hello"), (2,"world"), (3,null)).toDF("id", "name")

val safeString: String => String = s => if (s == null) "" else s
val udfSafeString = udf(safeString)

val dfSafe = df.select($"id", udfSafeString($"name").alias("name"))

dfSafe.show

如果您有很多列,并且其中一列是键列。我们可以这样做。

val safeCols = df.columns.map(colName => 
    if (colName == "id") col(colName) 
    else udfSafeString(col(colName)).alias(colName))

val dfSafe =  df.select(safeCols:_*)
dfSafe.show
slwdgvem

slwdgvem2#

您应该查看DataFrameNAFunctions。有一些函数可以将不同类型的字段中的空值替换为默认值。

val naFunctions = explodeDF.na
val nonNullDF = naFunctions.fill("")

这会将字符串字段中的所有空值替换为“”。
如果您的数据集包含一些具有不同数据类型的字段,则必须通过给出该特定类型的默认值来重复相同的函数。例如,可以为Int字段指定默认值0。

相关问题