2

我目前正在 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"), 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)

所以我想使用记录键作为专辑 ID 和轨道 ID 进行更新插入。所以我尝试使用以下代码进行初始插入(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 版本,火花为 2.4.x。我也尝试过 Hudi 的 0.5.2-incubating/0.6.0。

4

2 回答 2

1

您可以使用 ComplexKeyGenerator 或 CustomKeyGenerator。

于 2020-09-02T19:14:04.953 回答
1

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

于 2020-09-02T05:29:59.177 回答