Redshift将Hudi布尔列识别为bit类型致数据迁移失败求助
问题分析
Hudi格式的Parquet文件中,布尔类型列的底层编码可能为bit类型——尽管Spark读取后在Schema中显示为Boolean,但Spark Redshift连接器向Redshift写入时,会传递底层编码类型,导致Redshift识别为不支持的bit类型,进而触发报错。
解决方案
显式指定Redshift列类型映射
在写入Redshift的配置中,通过column_types参数强制指定validated列对应Redshift的BOOLEAN类型,覆盖自动推断逻辑:df.write \ .format("io.github.spark_redshift_community.spark.redshift") \ .option("url", "jdbc:redshift://your-cluster-endpoint:5439/your-db?user=xxx&password=xxx") \ .option("dbtable", "table_1") \ .option("tempdir", "s3://your-temp-bucket/path/") \ .option("forward_spark_s3_credentials", "true") \ .option("column_types", "validated BOOLEAN") \ .mode("overwrite") \ .save()重新定义Schema强制解析为布尔类型
直接通过自定义Schema读取Hudi数据,确保Spark严格将validated列解析为BooleanType,避免底层编码干扰:from pyspark.sql.types import StructType, StructField, StringType, DateType, BooleanType # 定义精确的表结构 target_schema = StructType([ StructField("id", StringType(), nullable=False), StructField("name", StringType(), nullable=True), StructField("date", DateType(), nullable=True), StructField("validated", BooleanType(), nullable=True) ]) # 加载Hudi数据并应用自定义Schema hudi_df = spark.read.schema(target_schema).format("hudi").load("s3://your-hudi-table-path/") # 执行写入Redshift操作 hudi_df.write... # 复用上述写入配置检查并修正Redshift目标表结构
确认Redshift中table_1的validated列类型为BOOLEAN,若之前误定义为BIT,执行DDL修改:ALTER TABLE table_1 ALTER COLUMN validated TYPE BOOLEAN;若表未创建,直接用正确类型建表:
CREATE TABLE table_1 ( id VARCHAR, name VARCHAR, date DATE, validated BOOLEAN );升级Spark Redshift连接器版本
旧版本连接器存在布尔类型推断bug,替换为最新社区版依赖(如适用于Spark 3.x的io.github.spark-redshift-community:spark-redshift_2.12:6.2.0),提升类型匹配的准确性。
内容的提问来源于stack exchange,提问作者Rahul Kohli
相关产品推荐
相关产品推荐

