scala—如何提取具有特定值的列名

lkaoscv7  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(369)

我有一个包含列名的列名列表,我正在迭代一行并检查它是否包含1,然后将该列名附加到列表中。使用zip或其他方法是否更好。

private def getNames(row: Row): List[String] = {
 val listofColumnNames = row.schema.fields.map(_.name).toList
    val listOfColumnWhichContainOne =  ArrayBuffer[String]()
    listofColumnNames.indices.foreach(index => {
      if(row.getInt(index).equals(1)) {
        listOfColumnWhichContainOne.append(listofColumnNames(index))
      }
    })
    listofColumnNames.toList
}

可以简化吗?

83qze16e

83qze16e1#

您可以将新列添加到现有数据框中,该数据框包含一个列列表,该列列表中的特定行的字段具有值 1 .
在withcolumn的列参数中,可以迭代所有其他列并检查所需的值:

val df = Seq((1, 2, 3), (4, 5, 6), (3, 2, 1)).toDF("col1", "col2", "col3")
df.show()

val cols = df.schema.fieldNames //change this array according to your needs
                                //if you want to exclude columns from the check

df.withColumn("result", array(
   cols.map {
       c: String => when(col(c).equalTo(1), c)
       }: _*
)).show()

印刷品:

//input data
+----+----+----+
|col1|col2|col3|
+----+----+----+
|   1|   2|   3|
|   4|   5|   6|
|   3|   1|   1|
+----+----+----+

//result
+----+----+----+--------------+
|col1|col2|col3|        result|
+----+----+----+--------------+
|   1|   2|   3|      [col1,,]|
|   4|   5|   6|          [,,]|
|   3|   1|   1|[, col2, col3]|
+----+----+----+--------------+

相关问题