在何时访问数据框的列名

时间:2019-12-25 22:46:39

标签: scala dataframe apache-spark

消磨时间。在这里,以及在pyspark中的非熊猫场景中,我可以生成列值,该值是与相关列名连接的值,例如我提供的解决方案:Appending column name to column value using Spark

然后,以下内容:

import org.apache.spark.sql.functions._
import spark.implicits._

val df = sc.parallelize(Seq(
    ("r1", 0.0, 0.0, 0.0, 0.0),
    ("r2", 6.4, 4.9, 6.3, 7.1),
    ("r3", 4.2, 0.0, 7.2, 8.4),
    ("r4", 1.0, 2.0, 0.0, 0.0)
)).toDF("ID", "aa1a", "bb3", "ccc4", "d1ddd")

val count_non_zero = df.columns.tail.map(x => when(col(x) === 0.0, 1).otherwise(0)).reduce(_ + _)

df.withColumn("non_zero_count", count_non_zero).show(false)

那么,如果仅出于参数考虑,

  • 我还想检查一下实际列名是否在其名称中的某处包含“ 1”,作为添加1的附加条件。

  • 我想在什么时候在val_count_non_zero中使用它?

我对生成列列表和要处理的序列不感兴趣。

正如我所说,这是出于争论的缘故。我在这里找不到在数据帧的时间范围内在Scala中进行列名检查的方法。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的要求,则可以Column设置列名,并使用方法contains包括其他条件:

val count_non_zero = df.columns.tail.map(x =>
    when(lit(x).contains("1") && col(x) === 0.0, 1).otherwise(0)
  ).
  reduce(_ + _)