apache spark groupBy pivot function

时间:2016-08-20 19:12:36

标签: scala csv apache-spark spark-dataframe

我是新来的火花和使用火花1.6.1。我正在使用pivot函数基于整数值创建新列。假设我有一个像这样的csv文件:

year,winds
1990,50
1990,55
1990,58
1991,45
1991,42
1991,58

我正在加载csv文件,如下所示:

var df =sqlContext.read.format("com.databricks.spark.csv").option("header", "true").option("inferSchema", "true").load("data/sample.csv")

我想聚集风colmnn过滤那些大于55的风,以便我得到这样的输出文件:

year, majorwinds
1990,2
1991,1

我使用的代码如下:     val df2 = df.groupBy(" major")。pivot(" winds")。agg(> 55) - >" count")

但是我收到了这个错误

error: expected but integer literal found

这里的语法是什么?提前致谢

2 个答案:

答案 0 :(得分:3)

在您的情况下,如果您只想输出:

+----+----------+
|year|majorwinds|
+----+----------+
|1990|         2|
|1991|         1|
+----+----------+

没有必要使用pivot

您可以使用filtergroupBycount来实现此目的:

df.filter($"winds" >= 55)
  .groupBy($"year")
  .count()
  .withColumnRenamed("count", "majorwinds")
  .show()

答案 1 :(得分:0)

使用此通用功能来执行数据透视

def transpose(sqlCxt: SQLContext, df: DataFrame, compositeId: Vector[String], pair: (String, String), distinctCols: Array[Any]): DataFrame = {
    val rdd = df.map { row => (compositeId.collect { case id => row.getAs(id).asInstanceOf[Any] }, scala.collection.mutable.Map(row.getAs(pair._1).asInstanceOf[Any] -> row.getAs(pair._2).asInstanceOf[Any])) }
    val pairRdd = rdd.reduceByKey(_ ++ _)
    val rowRdd = pairRdd.map(r => dynamicRow(r, distinctCols))
    sqlCxt.createDataFrame(rowRdd, getSchema(compositeId ++ distinctCols))
  }