2017-08-09 27 views
0

我從下面code.Each數據幀具有相同的列數和列名如何使用標識與名稱相同的兩個數據幀的列沒有給予別名他們

數據f2的獲取2個數據幀的.csv是

c1,c2,c3,c4 
k1,i,aa,k 
k5,j,ee,l 

數據f1.csv是

c1,c2,c3,c4 
k1,a,aa,e 
k2,b,bb,f 
k3,c,cc,g 
k4,d,dd,h 

我與下面的數據讀出上述兩個數據幀

val avro_inp = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load(f1.csv) 
val del_inp = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load(f2.csv) 

我試圖與dataframename.columnname 它拋出的SQL異常如下 訪問各個列是我使用

avro_inp.join(del_inp, Seq("c1", "c3"), "outer") 
.withColumn("c2",when(del_inp.col(colName="c2").isNotNull,del_inp.col(colName ="c2")).otherwise(avro_inp.col(colName = "c2"))) 
.withColumn("c4",when(avro_inp.col(colName="c4").isNull,del_inp.col(colName ="c4")).otherwise(avro_inp.col(colName = "c4"))) 
.drop(del_inp.col(colName="c2")).drop(del_inp.col(colName="c4")).show() 

代碼有什麼辦法,我可以做到不增加別名來在columns.I我得到下面的錯誤與上面的代碼

Exception in thread "main" org.apache.spark.sql.AnalysisException: Reference 'c4' is ambiguous, could be: c4#3, c4#7.; 
    at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolve(LogicalPlan.scala:287) 
    at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolveChildren(LogicalPlan.scala:171) 
+1

什麼是錯誤?它在我的地方完美運行。並更新與示例輸入以及 –

+1

我收到上述異常 – sri

+0

我建議你改變第二個表的列名 –

回答

0

你可以做類似下面,其中原始數據幀的名稱不會改變。 以下代碼在spark 2.0中進行了測試。

avro_inp.join(del_inp, Seq("c1", "c3"), "outer") 
    .withColumn("c22",when(del_inp.col(colName="c2").isNotNull, del_inp.col(colName ="c2")).otherwise(avro_inp.col(colName = "c2"))) 
    .withColumn("c44",when(avro_inp.col(colName="c4").isNull,del_inp.col(colName ="c4")).otherwise(avro_inp.col(colName = "c4"))) 
    .drop("c2", "c4") 
    .select($"c1", $"c22".as("c2"), $"c3", $"c44".as("c4")) 
+0

@himanshulllTian,爲什麼你需要兩滴當一個在我的工作很好。 :) –

+0

因爲在Spark 1.6中,'drop'方法使用'Column'或'String'作爲輸入。不是'字符串*' – himanshuIIITian

+0

我懷疑是這樣的:)那就是爲什麼我接受:)感謝糾正@himanshuIIITian –

0

你可以這樣做。

對於火花1.6

avro_inp.join(del_inp, Seq("c1", "c3"), "outer") 
.withColumn("c2_new",when(del_inp.col(colName="c2").isNotNull, del_inp.col(colName ="c2")).otherwise(avro_inp.col(colName = "c2"))) 
.withColumn("c4_new",when(avro_inp.col(colName="c4").isNull,del_inp.col(colName ="c4")).otherwise(avro_inp.col(colName = "c4"))) 
.drop(del_inp.col("c4")).drop(avro_inp.col("c4")) 
.drop(del_inp.col("c2")).drop(avro_inp.col("c2")) 
.select($"c1", $"c2_new".as("c2"), $"c3", $"c4_new".as("c4")) 
.show() 

但是,如果您使用的是Spark 2.0,請參閱@ RameshMaharjan的回答。

我希望它有幫助!

相關問題