Spark 1.6 drop columns基于值

时间:2017-03-24 16:24:41

标签: apache-spark dataframe

val max_col = df.select(df.columns.map(c => max(c)): _*)

给我一​​个包含多列的1行数据帧。其中许多列的值为0,即这些列中没有其他值(均为正数)。

如何仅选择最大值为>的列? 0?即如何删除所有列(不是行,有关于如何删除行的大量细节),其中max大于0?

a b c d

1 7 0 1

想要

a b d

1 7 1

val exprs = max_col.columns.map(c => when(col(c) !== 0, col(c)).otherwise("null").as(c))
val df_new = max_col.select(exprs:_*)

我可以将上面转到

a b c d

1 7 null 1

但没有成功找到列的na.drop。

好像是一个新手'问题,但没有找到一个好方法,但(我在网上浏览了几个小时,再次意识到谷歌肯定有他们的服务问题)。

非常感谢任何帮助。非常

1 个答案:

答案 0 :(得分:1)

你可以这样做:

val df = Seq((1,7,0,1)).toDF("a", "b", "c", "d")

df.selectExpr(df.first().getValuesMap[Int](df.columns).filter(_._2 > 0).keys.toSeq: _*).show
+---+---+---+
|  a|  b|  d|
+---+---+---+
|  1|  7|  1|
+---+---+---+
  1. 获取具有first()函数的行对象;
  2. 使用getValuesMap将行转换为地图;
  3. 根据值过滤地图;
  4. 获取满足过滤条件的键;
  5. 选择列;