如何解决仅当条件存在于数据帧中的列时才应用条件
我在Java8中使用spark-sql-2.4.1v。如果给定的数据框列列表中存在列,我有一种情况需要执行某些操作
我有以下示例数据框,根据数据库表上执行的外部查询,数据框的列会有所不同。
val data = List(
("20","score","school","2018-03-31",14,12,20),("21",13,21),("22","rate",11,22),23)
)
val df = data.toDF("id","code","entity","date","column1","column2","column3"..."columnN")
如上图所示,数据框的“数据”列不是固定的,并且会有所变化,并具有“ column1”,“ column2”,“ column3” ...“ columnN” ...
因此,取决于列的可用性,我需要执行一些操作 出于同样的原因,我尝试使用“ when-clause”,当存在一列时,我必须在指定的列上执行某些操作,否则继续进行下一个操作。
我正在尝试以下两种使用“ when-cluase”的方法
第一路:
Dataset<Row> resultDs = df.withColumn("column1_avg",when( df.schema().fieldNames().contains(col("column1")),avg(col("column1"))))
)
第二种方式:
Dataset<Row> resultDs = df.withColumn("column2_sum",when( df.columns().contains(col("column2")),sum(col("column1"))))
)
错误:
无法在数组类型String []上调用contains(Column)
那么如何使用java8代码处理这种情况?
解决方法
您可以创建具有所有列名称的列。那么您可以检查该列是否存在,并处理该列是否可用-
df.withColumn("columns_available",array(df.columns.map(lit): _*))
.withColumn("column1_org",when( array_contains(col("columns_available"),"column1"),col("column1")))
.withColumn("x","column4"),col("column1")))
.withColumn("column2_new","column2"),sqrt("column2")))
.show(false)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。