Ответ 1
Я столкнулся с той же ситуацией, и оказалось, что не только поля должны быть одинаковыми, но и вам нужно поддерживать одинаковый порядок полей в обоих кадрах данных, чтобы заставить его работать.
У меня есть два кадра данных 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)
Я столкнулся с той же ситуацией, и оказалось, что не только поля должны быть одинаковыми, но и вам нужно поддерживать одинаковый порядок полей в обоих кадрах данных, чтобы заставить его работать.
Я нашел следующий PR на github
https://github.com/apache/spark/pull/11333.
Это относится к столбцам UDF
(пользовательской функции), которые не были правильно обработаны во время объединения, и, следовательно, приведет к сбою объединения. PR фиксирует его, но он не заставил его зажечь 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)
Как уже упоминалось, порядок имеет значение. Так что просто выберите правильные столбцы в том же порядке, что и столбцы данных DataFrame
//Join 2 dataframes, but take columns in the same order
val df = left.unionAll(right.select(left.columns.map(col):_*))