Spark DataFrame union操作报列数不匹配错误排查
问题现象
实现逻辑:当df2为空时,向df1对应DataFrame新增一行数据。代码运行抛出列数不匹配异常,代码中从未定义名为value的列。
报错信息:
Exception in thread "main" java.lang.IllegalArgumentException: requirement failed: The number of columns doesn't match.
Old column names (1): value
New column names (2): country, code
问题复现代码:
var df1 = Seq.empty[(String,String)].toDF("country","code"). val df2 = spark.emptyDataFrame if (df2.isEmpty) df1 = df1.union(Seq("GLOBAL" , "EMPTY").toDF("country","code"))
报错原因
- 代码存在笔误:初始化
df1的行尾多了一个多余的.,会导致Scala语法解析异常。 - 核心错误在待新增数据的构造逻辑:
Seq("GLOBAL" , "EMPTY")是元素类型为String的序列,共包含2个独立的字符串元素,转成DataFrame后是2行1列结构,Spark会给这类单值序列生成的列默认命名为value——这就是异常里提到的未定义value列的来源。此时你给只有1列的DataFrame强行指定2个列名country、code,直接触发列数不匹配校验异常。
修复方案
- 删除
df1初始化行尾多余的句点。 - 构造单行新增数据时,将两个字段用圆括号包裹为二元组,保证转成DataFrame后是1行2列结构,和
df1的schema完全匹配。
修复后可运行代码:
var df1 = Seq.empty[(String,String)].toDF("country","code") val df2 = spark.emptyDataFrame if (df2.isEmpty) { // 待新增数据为二元组,外层Seq包裹后为1行2列,和df1列数、列名一致 df1 = df1.union(Seq(("GLOBAL", "EMPTY")).toDF("country","code")) }
内容的提问来源于stack exchange,提问作者stdinstoud
相关产品推荐
相关产品推荐

