使用一个带有REQUIRED列的UDF就是在我的Spark Dataframe中创建一个可以为null的列



我正在尝试创建一个Dataframe来写入Big Query表。Output表中的一列是我需要在管道中生成的REQUIRED ID。我使用UDF来实现这一点,但无论我尝试什么,列都被创建为可为null。

我是如何创建UDF:的

UserDefinedFunction genID = functions.udf(
(UDF1<String, String>) this::generateEmailCommID, DataTypes.StringType);

UDF调用自己的方法:

private String generateEmailID(String srcId) {
return UUID.nameUUIDFromBytes(("1_" + srcId).getBytes()).toString();
}

然后我在我的临时视图transformedData上使用这个:

spark.sql("SELECT message_ID AS src_id FROM transformedData")
.withColumn(email_id, genID.apply(functions.col("src_id")))

该列需要被REQUIRED以匹配输出表和列";src_id:为"nullable=false"。那么为什么";email_id";创建";nullable=true";我如何才能阻止这种情况的发生,这样我就可以写信给桌子了?

root
|-- email_id: string (nullable = true)
|-- src_id: string (nullable = false)

udf可能就是这样工作的。我假设Spark不知道udf可以返回什么,所以为了安全起见,它使列可以为null。

如果确定列中没有null,则可以添加coalesce("col_name", lit(""))。我的意思是,根据你有什么import,你可以使用

.withColumn("email_id", coalesce("email_id", lit("")))

.withColumn("email_id", functions.coalesce("email_id", functions.lit("")))

最新更新