crackcell's dustbin home projects
首页 > 在Spark UDF中处理NULL值 > 正文

在Spark UDF中处理NULL值

1 UDF的常见用法

常见的UDF写法是直接把列值传给UDF,例如Bucketizer这个类中的写法:

val bucketizer: UserDefinedFunction = udf { (feature: Double) =>
  Bucketizer.binarySearchForBuckets($(splits), feature, keepInvalid)
}

val newCol = bucketizer(filteredDataset($(inputCol)))
val newField = prepOutputField(filteredDataset.schema)
filteredDataset.withColumn($(outputCol), newCol, newField.metadata)
  • 常见用法:
    • 调用的时候,直接把Column的对象传递给UDF函数
    • UDF函数里面,接收的参数是Double、Integer等基本类型
  • 这种用法不能在UDF里面识别是否传入的参数是否为NULL

2 能判断NULL的写法

还是以Bucketizer的写法为例:

val bucketizer: UserDefinedFunction = udf { (row: Row) =>
  if (row.isNullAt(0)) ...
}

val newCol = bucketizer(struct(Array(filteredDataset($(inputCol))): _*))
val newField = prepOutputField(filteredDataset.schema)
filteredDataset.withColumn($(outputCol), newCol, newField.metadata)
  • 这里传入的一整列,然后用Row.isNullAt()来判断某个字段是否为NULL

Date: Wed Mar 1 14:41:38 2017

Author: Menglong TAN

Created: 2017-03-01 Wed 14:56

Emacs 24.5.1 (Org mode 8.2.10)

Validate

Modified theme and code from Tom Preston-Werner.