2016-07-29 15 views
14

私は2つのデータフレームdf1df2を持っています。それらの両方は、次のスキーマを持っている:スパーク1.5.2:org.apache.spark.sql.AnalysisException:未解決の演算子 'Union;

|-- 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が同等の寄木細工のファイルから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) 

答えて

19

私は同じような状況に遭遇し、それはフィールドが同じである必要はなく、また、あなたが正確に維持する必要がないだけであることが判明します両方のデータフレームでフィールドを同じ順序で並べ替えて動作させます。

+0

はい、問題はあります。 – soulmachine

+4

と同様にフィールドのデータ型 –

2

私はgithubの

https://github.com/apache/spark/pull/11333上で、次のPRを発見しました。

これは、ユニオン中に正しく処理されなかったUDF(ユーザー定義関数)列に関連するため、ユニオンが失敗する原因になります。 PRはそれを修正するが、それは1.6.2を発火させたわけではないが、まだspark 2.xにチェックしていない。

あなたが周りの愚かな仕事があります1.6.xに立ち往生している場合は、RDDDataFrameをマッピングし、バック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() 
3

これは古いですし、周りに横たわっているいくつかの答えが既に存在しているが、私はちょうど直面この問題は、のように2つのデータフレームの労働組合を作るしようとしているときに...

//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):_*)) 
関連する問題