我从下面的代码中获取了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)
答案 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的答案。
我希望它有所帮助!