2017-08-09 21 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的回答。

我希望它有帮助!

相关问题