我正在尝试创建一个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("")))