2016-07-29 7 views
14

मेरे पास दो डेटा फ्रेम df1 और df2 हैं। उन दोनों निम्न स्कीमा है:स्पार्क 1.5.2: org.apache.spark.sql.AnalysisException: अनसुलझे ऑपरेटर संघ;

|-- 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 पर निम्नलिखित पीआर पाया।

UDF (उपयोगकर्ता परिभाषित फ़ंक्शन) कॉलम से संबंधित है, जो संघ के दौरान सही तरीके से संभाले नहीं गए थे, और इस प्रकार संघ विफल हो जाएगा। पीआर इसे ठीक करता है, लेकिन इसने इसे 1.6.2 पर स्पार्क नहीं किया है, मैंने अभी तक spark 2.x पर चेक नहीं किया है।

आप 1.6.x पर अटक कर रहे हैं वहाँ एक मूर्ख काम के आसपास, एक 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

यह पुराना है और वहाँ पहले से ही कुछ चारों ओर झूठ बोल रही है उत्तर दिए गए हैं, लेकिन मैं तो बस का सामना करना पड़ा के लिए एक RDD को DataFrame नक्शा और वापस इस समस्या में दो डेटाफ्रेम का संघ बनाने की कोशिश करते समय ...

//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):_*)) 
संबंधित मुद्दे