You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Parquet文件写入ADLS Gen2时遇DELTA_BYTE_ARRAY编码错误求助

解决Spark读取Parquet时的DELTA_BYTE_ARRAY编码不支持问题

问题原因

DELTA_BYTE_ARRAY是Parquet格式的一种高效增量编码方式,你的Spark任务报错是因为当前使用的Spark版本对应的Parquet读取器(尤其是默认的向量化读取器)不支持这种编码。这类情况常见于读取由Kusto等特定系统导出的Parquet文件,这类系统可能会使用Spark默认Parquet reader未兼容的编码优化。

解决方案

1. 关闭Parquet向量化读取器

Spark的向量化读取器为了提升性能,对部分编码的支持有限。关闭该功能后,会使用传统的非向量化读取器,兼容更多编码格式,是快速解决问题的方案:

// 禁用向量化Parquet读取器
spark.conf.set("spark.sql.parquet.enableVectorizedReader", "false")

val kustoLogsSourcePath: String = "/mnt/SOME_FOLDER/2023/01/11/fe73f221-b771-49c9-ba7d-2e2af4fe4f2a_1_69fc119b888447efa9ed2ecd7a4ab647.parquet" 
val outputPath: String = "/mnt/SOME_FOLDER/2023/01/10/EventLogs1/" 
val kustoLogData = spark.read.parquet(kustoLogsSourcePath) 
kustoLogData.write.mode(SaveMode.Overwrite).save(outputPath)

注意:该方案会降低Parquet读取性能,适合小数据量场景或临时应急使用。

2. 升级Spark版本

Spark 3.2及以上版本对Parquet的DELTA系列编码(包括DELTA_BYTE_ARRAY)提供了完善支持。如果有集群升级权限,将Spark版本升级到3.2+是长期的最优解决方案,既能解决编码兼容问题,又能保留向量化读取的性能优势。

3. 使用Kusto官方Spark连接器读取

由于源文件是Kusto导出的日志,使用Azure Kusto官方提供的Spark连接器可以更好地兼容Kusto导出的Parquet格式:

首先确保集群中添加了Kusto Spark连接器依赖(例如Maven坐标com.microsoft.azure.kusto:kusto-spark_3.0_2.12:3.0.0),然后使用以下方式读取:

val kustoLogsSourcePath: String = "/mnt/SOME_FOLDER/2023/01/11/fe73f221-b771-49c9-ba7d-2e2af4fe4f2a_1_69fc119b888447efa9ed2ecd7a4ab647.parquet" 
val outputPath: String = "/mnt/SOME_FOLDER/2023/01/10/EventLogs1/" 

val kustoLogData = spark.read
  .format("com.microsoft.kusto.spark.datasource")
  .option("path", kustoLogsSourcePath)
  .load()

kustoLogData.write.mode(SaveMode.Overwrite).save(outputPath)

该方案是针对Kusto导出文件的专属兼容方案,性能和兼容性都有保障。

内容的提问来源于stack exchange,提问作者Sumitiscreative

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:25:19