我是新来的火花和使用火花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
这里的语法是什么?提前致谢
答案 0 :(得分:3)
在您的情况下,如果您只想输出:
+----+----------+
|year|majorwinds|
+----+----------+
|1990| 2|
|1991| 1|
+----+----------+
没有必要使用pivot
。
您可以使用filter
,groupBy
和count
来实现此目的:
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))
}