向上插入时,spark hudi作业中的记录键超过1列

to94eoyn  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(536)

我目前正在deltalake上做一个poc,在那里我遇到了一个叫做apachehudi的框架。下面是我试图使用apachespark框架编写的数据。

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"), dateToLong("2019-12-01")),
Album(801,811, "Hail to the Thief", Array("2+2=5", "Backdrifts", "Go to sleep"), dateToLong("2019-12-03"))
)

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

所以我想使用record键作为albumid和trackid进行一次upsert。因此,我尝试使用下面的代码进行初始插入(albumdf是从上面的初始\u album\u数据创建的Dataframe):

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时,它会像charm一样工作,但如果有两个键就失败了。目前我使用的是hudi的0.5.3和scala的2.11版本,spark是2.4.x。我也尝试过hudi的0.5.2孵化/0.6.0。

qlfbtfca

qlfbtfca1#

您可以使用complexkeygenerator或customkeygenerator来实现相同的功能。

zc0qhyus

zc0qhyus2#

这可以用complexkeygenerator而不是simplekeygenerator来解决。

相关问题