我正在处理Apache spark中的大型数据集(包含332个字段),scala(除了一个字段,其余331可以为null)大约有10M条记录。但我想用空字符串(“”)替换null。由于我拥有大量的领域,最好的方法是什么? 我想在导入此数据集时处理空值,以便在执行转换或导出到DF时保证安全。所以我创建了包含332个字段的case类,处理这些空值的最佳方法是什么?我可以使用Option(字段).getOrElse(“”),但我想这不是最好的方法,因为我有大量的字段。谢谢!!
答案 0 :(得分:4)
我们可以使用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
答案 1 :(得分:1)
您应该查看DataFrameNAFunctions。有些函数可以将不同类型字段中的空值替换为默认值。
val naFunctions = explodeDF.na
val nonNullDF = naFunctions.fill("")
这会将字符串字段中的所有空值替换为""。
如果您的数据集包含一些具有不同数据类型的字段,则必须通过提供该特定类型的默认值来重复相同的功能。例如,Int字段可以被赋予默认值0。