Apache spark Spark 1.5.2:org.apache.Spark.sql.AnalysisException:未解析运算符';工会;

Apache spark Spark 1.5.2:org.apache.Spark.sql.AnalysisException:未解析运算符';工会;,apache-spark,Apache Spark,我有两个数据帧df1和df2。它们都具有以下架构: |-- ts: long (nullable = true) |-- id: integer (nullable = true) |-- managers: array (nullable = true) | |-- element: string (containsNull = true) |-- projects: array (nullable = true) | |-- element: string (cont

我有两个数据帧
df1
df2
。它们都具有以下架构:

 |-- ts: long (nullable = true)
 |-- id: integer (nullable = true)
 |-- managers: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- projects: array (nullable = true)
 |    |-- element: string (containsNull = true)
df1
是从avro文件创建的,而
df2
是从等效的拼花地板文件创建的。但是,如果执行,
df1.unionAll(df2.show()
,则会出现以下错误:

    org.apache.spark.sql.AnalysisException: unresolved operator 'Union;
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$class.failAnalysis(CheckAnalysis.scala:37)
    at org.apache.spark.sql.catalyst.analysis.Analyzer.failAnalysis(Analyzer.scala:44)
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1.apply(CheckAnalysis.scala:174)
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1.apply(CheckAnalysis.scala:49)
    at org.apache.spark.sql.catalyst.trees.TreeNode.foreachUp(TreeNode.scala:103)

我遇到了同样的情况,结果证明,不仅字段需要相同,而且您还需要在两个数据帧中保持字段的顺序完全相同,以使其正常工作。

我在github上发现了以下PR

这与
UDF
(用户定义函数)列有关,在联合期间未正确处理这些列,因此将导致联合失败。PR修复了它,但它还没有进入spark
1.6.2
,我还没有检查
spark 2.x

如果您被困在
1.6.x
上,有一个愚蠢的解决方法,请将
DataFrame
映射到
RDD
并返回到
DataFrame

// for a DF with 2 columns (Long, Array[Long])
val simple = dfWithUDFColumn
  .map{ r => (r.getLong(0), r.getAs[Array[Long]](1))} // DF --> RDD[(Long, Array[Long])]
  .toDF("id", "tags") // RDD --> back to DF but now without UDF column

// dfOrigin has the same structure but no UDF columns
val joined = dfOrigin.unionAll(simple).dropDuplicates(Seq("id")).cache()

这是旧的,已经有一些答案,但我只是面对这个问题,而试图使两个数据帧的联合,如在

//Join 2 dataframes
val df = left.unionAll(right)
正如其他人所提到的,秩序很重要。所以只需按与左数据框列相同的顺序选择右列即可

//Join 2 dataframes, but take columns in the same order    
val df = left.unionAll(right.select(left.columns.map(col):_*))

是的,顺序很重要!以及字段的数据类型