进行更新时,Spark Hudi Job的记录键中有超过1列的内容

问题描述

我目前正在deltalake上进行POC,在那里遇到了称为Apache Hudi的框架。以下是我尝试使用apache spark框架编写的数据。

 private val INITIAL_ALBUM_DATA = Seq(
Album(800,810,"6 String Theory",Array("Lay it down","Am I Wrong","68"),datetoLong("2019-12-01")),Album(801,811,"Hail to the Thief",Array("2+2=5","Backdrifts"),"Backdrifts","Go to sleep"),datetoLong("2019-12-03"))
)

The class : 
case class Album(albumId: Long,trackId: Long,title: String,tracks: Array[String],updateDate: Long)

所以我想使用记录键作为albumId和trackId进行更新。因此,我尝试使用以下代码进行初始插入(albumDf是从INITIAL_ALBUM_DATA上方创建的数据框):

albumDf.write
.format("hudi")
.option(DataSourceWriteOptions.TABLE_TYPE_OPT_KEY,DataSourceWriteOptions.COW_TABLE_TYPE_OPT_VAL)
.option(DataSourceWriteOptions.RECORDKEY_FIELD_OPT_KEY,"albumId,trackId")
.option(DataSourceWriteOptions.PRECOMBINE_FIELD_OPT_KEY,combineKey)
.option(HoodieWriteConfig.TABLE_NAME,tableName)
.option(DataSourceWriteOptions.OPERATION_OPT_KEY,DataSourceWriteOptions.UPSERT_OPERATION_OPT_VAL)
.option("hoodie.upsert.shuffle.parallelism","2")
.mode(SaveMode.Append)
.save(s"$basePath/$tableName/")

但是似乎它不能用多个键写。我在上面运行时遇到的错误是:

... 5 more
Caused by: org.apache.hudi.exception.HoodieKeyException: recordKey value: "null" for field: "albumId,trackId" cannot be null or empty.
at org.apache.hudi.keygen.SimpleKeyGenerator.getKe

有人用多个键尝试过吗?当我尝试使用单个键trackId或albumId时,它可以用作超级按钮,但使用2个键时会失败。目前,我正在使用Hudi的0.5.3和scala的2.11版本,其中spark为2.4.x。我也尝试过使用Hudi的0.5.2-incubating / 0.6.0。

解决方法

这可以使用ComplexKeyGenerator而不是SimplekeyGenerator来解决。

,

您可以同时使用ComplexKeyGenerator或CustomKeyGenerator。