Spark读取Teradata写Parquet时出现ClassCastException异常求助
问题根因
你遇到的java.lang.ClassCastException和DataFrame内的数据无关,完全是API调用参数格式错误导致:
PySpark的DataFrameWriter.partitionBy()方法要求传入多个独立的字符串格式列名,不支持直接传入Python列表作为单个参数。你直接传入列表时,跨语言调用的Py4J会将Python列表转换为Java的ArrayList对象,和方法预期的String入参类型不匹配,因此抛出类型转换异常。你疑惑的ArrayList并非DataFrame数据生成,就是你传入的列表参数在Java层的类型。
解决方案
只需对列表参数做解包操作即可:在传入partitionBy时给列表变量前加*符号,将列表内的元素拆分为独立的参数传入。
修正后的代码示例如下:
partition_keys = ["Cat$col1", "Cat$col2"] df.write.mode("overwrite") \ .partitionBy(*partition_keys) \ .parquet("s3://<你的存储桶路径>/<目标输出目录>")
补充说明
如果后续测试中发现列名中的$符号引发解析异常,可以在读取数据后统一重命名分区列,将$替换为下划线等合法字符后再执行写入操作,示例如下:
# 重命名分区列示例 df = df.withColumnRenamed("Cat$col1", "cat_col1") \ .withColumnRenamed("Cat$col2", "cat_col2") partition_keys = ["cat_col1", "cat_col2"]
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

