如何使用scala在Apache spark中用空字符串(“”)替换空值[重复]

Posted

技术标签:

【中文标题】如何使用scala在Apache spark中用空字符串(“”)替换空值[重复]【英文标题】:How to replace nulls with empty string ("") in Apache spark using scala [duplicate] 【发布时间】:2017-08-21 06:22:30 【问题描述】:

我正在 Apache spark 中使用大约 10M 条记录的 Scala(除了一个字段,其余 331 可以为空)处理巨大的数据集(包含 332 个字段)。但我想用空白字符串(“”)替换 null。由于我有大量字段,因此实现这一目标的最佳方法是什么? 我想在导入此数据集时处理空值,以便在执行转换或导出到 DF 时安全。所以我创建了具有 332 个字段的案例类,处理这些空值的最佳方法是什么?我可以使用 Option(field).getOrElse(""),但我想这不是最好的方法,因为我有大量的字段。谢谢!!

【问题讨论】:

@mtoto 不应该被标记为这个问题的重复:***.com/questions/33376571/… @eliasah 和 mtoto:我同意上述评论。很高兴找到慈善家 【参考方案1】:

我们可以使用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

【讨论】:

【参考方案2】:

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

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

这会将字符串字段中的所有空值替换为“”。

如果您的数据集有一些具有不同数据类型的字段,那么您必须通过提供该特定类型的默认值来重复相同的功能。例如,可以为 Int 字段赋予默认值 0。

【讨论】:

这应该是公认的答案!

以上是关于如何使用scala在Apache spark中用空字符串(“”)替换空值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 spark scala 向空数据框添加一行

如何在idea中用maven配置spark和scala

如何在 Scala 中将 Spark DataFrames 一一添加到 Seq()

Scala Spark用NULL替换空String

Spark 中用 Scala 和 java 开发有啥区别

如何使用 Apache Spark 和 Scala 创建嵌套 json