Почему apache-hudi создает таблицу COPY_ON_WRITE, даже если я дал MERGE_ON_READ?

#pyspark #apache-hudi

Вопрос:

Я пытаюсь создать простую таблицу hudi с типом таблицы MERGE_ON_READ. После выполнения кода все еще в файле hoodie.properties я вижу hoodie.table.type=COPY_ON_WRITE

Я что-то здесь упускаю ?

Записная книжка Jupyter для этого кода: https://github.com/sannidhiteredesai/spark/blob/master/hudi_acct.ipynb

 hudi_options = {
    "hoodie.table.name": "hudi_acct",
    "hoodie.table.type": "MERGE_ON_READ",
    "hoodie.datasource.write.operation": "upsert",
    "hoodie.datasource.write.recordkey.field": "acctid",
    "hoodie.datasource.write.precombine.field": "ts",
    "hoodie.datasource.write.partitionpath.field": "date",
    "hoodie.datasource.write.hive_style_partitioning": "true",
    "hoodie.upsert.shuffle.parallelism": 8,
    "hoodie.insert.shuffle.parallelism": 8,
}

input_df = spark.createDataFrame(
    [
        (100, "2015-01-01", "2015-01-01T13:51:39.340396Z", 10),
        (101, "2015-01-01", "2015-01-01T12:14:58.597216Z", 10),
        (102, "2015-01-01", "2015-01-01T13:51:40.417052Z", 10),
        (103, "2015-01-01", "2015-01-01T13:51:40.519832Z", 10),
        (104, "2015-01-02", "2015-01-01T12:15:00.512679Z", 10),
        (104, "2015-01-02", "2015-01-01T12:15:00.512679Z", 10),
        (104, "2015-01-02", "2015-01-02T12:15:00.512679Z", 20),
        (105, "2015-01-02", "2015-01-01T13:51:42.248818Z", 10),
    ],
    ("acctid", "date", "ts", "deposit"),
)

# INSERT
(
    input_df.write.format("org.apache.hudi")
    .options(**hudi_options)
    .mode("append")
    .save(hudi_dataset)
)


update_df = spark.createDataFrame(
    [(100, "2015-01-01", "2015-01-01T13:51:39.340396Z", 20)],
    ("acctid", "date", "ts", "deposit"))

# UPDATE
(
    update_df.write.format("org.apache.hudi")
    .options(**hudi_options)
    .mode("append")
    .save(hudi_dataset)
)
 

Редактировать: После выполнения вышеуказанного кода я вижу 2 файла parquet, созданных в разделе дата=2015-01-01. При чтении 2-го паркетного файла я ожидал получить только обновленную запись 1, но я также вижу все остальные записи в этом разделе.

Комментарии:

1. Пожалуйста, дайте мне знать, поможет ли следующий ответ.

Ответ №1:

Проблема в "hoodie.table.type": "MERGE_ON_READ", конфигурации. Вы должны использовать hoodie.datasource.write.table.type вместо этого. Если вы обновите конфигурацию следующим образом, она будет работать. Я проверил.

 hudi_options = {
    "hoodie.table.name": "hudi_acct",
    "hoodie.datasource.write.table.type": "MERGE_ON_WRITE",
    "hoodie.datasource.write.operation": "upsert",
    "hoodie.datasource.write.recordkey.field": "acctid",
    "hoodie.datasource.write.precombine.field": "ts",
    "hoodie.datasource.write.partitionpath.field": "date",
    "hoodie.datasource.write.hive_style_partitioning": "true",
    "hoodie.upsert.shuffle.parallelism": 8,
    "hoodie.insert.shuffle.parallelism": 8,
    "hoodie.compact.inline": "true",
    "hoodie.compact.inline.max.delta.commits": 10
}
 

Комментарии:

1. MERGE_ON_WRITE — ошибка

Ответ №2:

не могли бы вы сначала попробовать режим(«перезапись») при использовании insert для загрузки данных в hudi и посмотреть, работает ли он?

Комментарии:

1. Я пробовал в режиме перезаписи, но все равно он показывает те же результаты, что и КОПИРОВАНИЕ ПРИ ЧТЕНИИ….. Это как-то связано с размером моих входных данных ? Поскольку входные данные, а также обновленные данные очень малы, использует ли hudi COPY_ON_WRITE по умолчанию ?

2. github.com/sannidhiteredesai/spark/blob/master/hudi_acct.ipynb

3. нет, это не должно быть связано с вашим размером данных. правильно ли имя таблицы в файле hoodie.properties?

4. Да, имя таблицы правильное. Это в толстовке.свойства толстовки.таблица. предварительно скомбинировать. поле=толстовка ts.таблица.имя=толстовка hudi_acct. архивный журнал. папка=архивная толстовка с капюшоном.таблица.тип=COPY_ON_WRITE толстовка с капюшоном.таблица.версия=1 толстовка с капюшоном.временная шкала. макет.версия=1