Более 1 столбца в ключе записи в Spark Hudi Job при создании апсерта

В настоящее время я делаю POC на deltalake, где я наткнулся на фреймворк под названием 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)

Итак, я хочу сделать апсерт, используя ключ записи как 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, он работает как шарм, но с двумя ключами он терпит неудачу. В настоящее время я использую версию Hudi 0.5.3 и scala 2.11 с искрой 2.4.x. Я также пробовал с Hudi 0.5.2-incubating/0.6.0.

2 ответа

Решение

Это можно решить с помощью ComplexKeyGenerator вместо SimplekeyGenerator.

Вы можете использовать ComplexKeyGenerator или CustomKeyGenerator для того же.

Другие вопросы по тегам