如何使用具有相同名称的两个数据框的标识列,而不为它们指定别名

时间:2017-08-09 00:29:37

标签: scala apache-spark dataframe

我从下面的代码中获取了2个数据框。每个数据框具有相同数量的列和列名称

f2.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()

有没有办法,我可以做到没有添加别名到列。我得到跟随上述代码的错误

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)

2 个答案:

答案 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"))

答案 1 :(得分: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的答案。

我希望它有所帮助!