Scala环境下访问Parquet文件遇INT32(UINT_32)不支持错误求助
解决Scala读取Parquet时INT32(UINT_32)类型不支持的问题
你遇到的错误根源很明确:Parquet文件里的**INT32 (UINT_32)**无符号整数类型不在Spark默认支持的类型列表里,导致Schema解析失败,进而触发IO异常。
下面是几种可行的解决办法:
手动指定Schema映射类型
因为UINT32的取值范围(0~4294967295)超过了Scala Int的最大值(2147483647),直接映射为LongType更稳妥,避免数值溢出。示例代码:import org.apache.spark.sql.types._ // 按实际文件结构定义自定义Schema,替换掉UINT32字段的类型 val customSchema = StructType(Array( StructField("target_uint32_col", LongType, nullable = true), StructField("other_column1", StringType, nullable = true), StructField("other_column2", IntegerType, nullable = true) // 其他字段依次补充 )) // 用自定义Schema读取目标Parquet文件 val df = spark.read.schema(customSchema).parquet("//XXX/20220814/xxx.parquet")开启Spark对无符号整数的支持(Spark 3.0及以上版本可用)
在读取文件前添加配置,让Spark自动识别并处理UINT_32类型:// 关闭向量化读取,搭配无符号整数支持配置使用 spark.conf.set("spark.sql.parquet.enableVectorizedReader", "false") // 开启无符号整数类型支持 spark.conf.set("spark.sql.parquet.unsignedIntegerType.enabled", "true") // 直接读取文件即可,Spark会自动将UINT_32解析为LongType val df = spark.read.parquet("//XXX/20220814/xxx.parquet")预处理源Parquet文件(若有权限修改)
用parquet-tools或者其他ETL工具,把文件里的UINT_32类型转换为标准的INT64或者INT32(确认数值不会溢出的情况下),之后再用Scala读取。
内容的提问来源于stack exchange,提问作者Giridhar Chims
相关产品推荐
相关产品推荐

