繁体   English   中英

如何在Scala中将表转换为时间序列表

[英]How to pivot a table into a timeseries table in Scala

我有下表:

index   0       1       2       id  
1       9.69    1.18    0.59    62
2       7.38    2.18    0.87    62
3       10.02   1.16    0.29    62

我试图将其转入一个像表这样的时间序列。

预期产量:

data                    id
[9.69, 7.38, 10.02]     62
[1.18, 2.18, 1.16]      62
[0.59, 0.87, 0.29]      62

我尝试了以下代码

val table = df.groupBy(df.col("id")).pivot("index").sum("0").cache()
val tablets = table.map(x => new transform(1.until(x.length).map(x.getDouble(_)).toList, x.getString(0)))
case class transform(data:List[Double], start:String)

但是只给出了这个输出

[9.69, 7.38, 10.02]     62

如何遍历所有列并获得所需的输出表,如上所述?

class pivot (df: DataFrame) {


val col1Names = df.drop("id").columns.tail
val kv = explode(array(df.select(col1Names.map(col): _*).columns.map {
c => struct(lit(c).alias("k"), col(c).alias("v"))
}: _*))

val tempdf = df.withColumn("kv", kv)
.select("index", "kv.k", "kv.v", "id")
.groupBy("id", "k")
.pivot("index")
.agg(first("v"))
.drop("k")

val col2Names = tempdf.columns.tail
val finaldf = tempdf.withColumn("data", array(col2Names.map(col): _*)).drop(col2Names: _*)

}

在您的解决方案中,您使用了groupBysum ,将为每个组生成aggregated row 这就是为什么您得到一个结果的原因。

解决您的问题的方法有点复杂。 我使用了withColumn, explode, array, struct, pivot, groupBy, agg, drop, col, select and alias 以下是解决方案

   val df = Seq((1, 9.69,  1.18, 0.59, 62),
     (2, 7.38,  2.18, 0.87, 62),
     (3, 10.02, 1.16, 0.29, 62)).toDF("index", "0", "1", "2", "id")

根据您的问题中的定义,您必须已经通过读取以上输入内容获得了以下数据框

+-----+-----+----+----+---+
|index|0    |1   |2   |id |
+-----+-----+----+----+---+
|1    |9.69 |1.18|0.59|62 |
|2    |7.38 |2.18|0.87|62 |
|3    |10.02|1.16|0.29|62 |
+-----+-----+----+----+---+

如果是,则以下解决方案应该起作用。

val col1Names = df.drop("id").columns.tail
val kv = explode(array(df.select(col1Names.map(col): _*).columns.map {
  c => struct(lit(c).alias("k"), col(c).alias("v"))
}: _*))

val tempdf = df.withColumn("kv", kv)
                .select("index", "kv.k", "kv.v", "id")
                .groupBy("id", "k")
                .pivot("index")
                .agg(first("v"))
                .orderBy("k")
                .drop("k")

  val col2Names = tempdf.columns.tail
  val finaldf = tempdf.withColumn("data", array(col2Names.map(col): _*)).drop(col2Names: _*).sort($"data".desc)

您应该得到以下输出

+---+-------------------+
|id |data               |
+---+-------------------+
|62 |[9.69, 7.38, 10.02]|
|62 |[1.18, 2.18, 1.16] |
|62 |[0.59, 0.87, 0.29] |
+---+-------------------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM