在分析的數據縮減階段,我想要刪除列總數低於所有列總計中值的所有列。 因此,與數據集:scala:刪除列值低於所有列的中值的列
v1,v2,v3
1 3 5
3 4 3
我之列
v1,v2,v3
4 7 8
中值是7,所以我放下V1
v2,v3
3 5
4 3
我以爲我可以與排流功能做到這一點。但這似乎不可能。
代碼我已經拿出了作品,但它看起來很冗長,看起來很像Java代碼(我認爲這是我做錯了的一個標誌)。
是否有任何更有效的方法來執行此操作?
val val dfv2=DataFrameUtils.openFile(spark,"C:\\Users\\jake\\__workspace\\R\\datafiles\\ikodaDataManipulation\\VERB2.csv")
//return a single row dataframe with sum of each column
val dfv2summed:DataFrame=dfv2.groupBy().sum()
logger.info(s"dfv2summed col count is ${dfv2summed.schema.fieldNames.length}")
//get the rowValues
val rowValues:Array[Long]=dfv2summed.head().getValuesMap(dfv2summed.schema.fieldNames).values.toArray
//sort the rows
scala.util.Sorting.quickSort(rowValues)
//calculate medians (simplistically)
val median:Long = rowValues(rowValues.length/2)
//ArrayBuffer to hold column needs that need removing
var columnArray: ArrayBuffer[String] = ArrayBuffer[String]()
//get tuple key value pairs of columnName/value
val entries: Map[String, Long]=dfv2summed.head().getValuesMap(dfv2summed.schema.fieldNames)
entries.foreach
{
//find all columns where total value below median value
kv =>
if(kv._2.<(median))
{
columnArray+=kv._1
}
}
//drop columns
val dropColumns:Seq[String]=columnArray.map(s => s.substring(s.indexOf("sum(")+4,s.length-1)).toSeq
logger.info(s"todrop ${dropColumns.size} : ${dropColumns}")
val reducedDf=dfv2.drop(dropColumns: _*)
logger.info(s"reducedDf col count is ${reducedDf.schema.fieldNames.length}")
請分享數據。例如,做預期輸出 – mtoto
。請參閱 – Jake