常见问题

最近更新时间: 2026-03-13 09:03:00

Spark查询Hudi数据重复,如何处理?

问题原因:出现Spark查询hudi数据重复,通常是因为Hudi不支持Spark DataSource方式读取导致的。
解决方法:您需要在执行查询Hudi表的命令时,添加上spark.sql.hive.convertMetastoreParquet=false。

Hive查询Hudi数据重复,如何处理?

问题原因:Hive默认使用HiveCombineInputFormat不会调用表自定义的input format。
解决方法:您需要在执行查询Hudi表的命令时,添加上set hive.input.format = org.apache.hudi.hadoop.hive.HoodieCombineHiveInputFormat。

Spark查询Hudi表分区裁剪不生效?

问题原因:可能是在分区字段包含/(正斜线)的情况下,分区字段个数和实际分区目录级数不一致,导致Spark分区裁剪失效。
解决方法:您在使用Spark DataFrame API写Hudi表时,需要加上hoodie.datasource.write.partitionpath.urlencode= true。

使用Spark的alter table语句时,报错xxx is only supported with v2 tables,如何处理?

问题原因:这是因为使用Hudi Spark的模式演变功能时,需要将Hudi的配置项hoodie.schema.on.read.enable设置为true。
解决方法:请在对Hudi表进行alter table操作时添加配置set hoodie.schema.on.read.enable=true。更多详细信息请参考Apache Hudi的Spark SQL Schema Evolution and Syntax Description

写时复制(COW)与读时合并(MOR)存储类型之间有什么区别?

写时复制(Copy On Write):此存储类型使客户端能够以列式文件格式(当前为parquet)摄取数据。使用COW存储类型时,任何写入Hudi数据集的新数据都将写入新的parquet文件。更新现有的行将导致重写整个parquet文件(这些parquet文件包含要更新的受影响的行)。因此,所有对此类数据集的写入都受parquet写性能的限制,parquet文件越大,摄取数据所花费的时间就越长。
读时合并(Merge On Read):此存储类型使客户端可以快速将数据摄取为基于行(如Avro)的数据格式。使用MOR存储类型时,任何写入Hudi数据集的新数据都将写入新的日志/增量文件,这些文件在内部将数据以avro进行编码。压缩(Compaction)过程(配置为嵌入式或异步)将日志文件格式转换为列式文件格式(parquet)。
两种不同的格式提供了两种不同视图(读优化视图和实时视图),读优化视图取决于列式parquet文件的读取性能,而实时视图取决于列式和/或日志文件的读取性能。
更新现有的行将导致:a)写入从以前通过压缩(Compaction)生成的基础parquet文件对应的日志/增量文件更新;或b)在未进行压缩的情况下写入日志/增量文件的更新。因此,对此类数据集的所有写入均受Avro /日志文件写入性能的限制,其速度比parquet快得多(写入时需要复制)。虽然,与列式(parquet)文件相比,读取日志/增量文件需要更高的成本(读取时需要合并)。