仅当条件存在于数据帧中的列时才应用条件

问题描述

我在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)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...