Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在Spark中收集和处理列数据_Scala_Apache Spark_Spark Dataframe - Fatal编程技术网

Scala 如何在Spark中收集和处理列数据

Scala 如何在Spark中收集和处理列数据,scala,apache-spark,spark-dataframe,Scala,Apache Spark,Spark Dataframe,我有一个dataframe包含7天24小时的数据,所以它有144列 id d1h1 d1h2 d1h3 ..... d7h24 aaa 21 24 8 ..... 14 bbb 16 12 2 ..... 4 ccc 21 2 7 ..... 6 我想做的是找到每天最多3个值: id d1 d2 d3 .... d7 aaa [22

我有一个dataframe包含7天24小时的数据,所以它有144列

id     d1h1  d1h2   d1h3 .....  d7h24 
aaa    21     24     8   .....   14       
bbb    16     12     2   .....   4
ccc    21      2     7   .....   6
我想做的是找到每天最多3个值:

id    d1        d2       d3  ....   d7
aaa  [22,2,2] [17,2,2] [21,8,3]    [32,11,2]
bbb  [32,22,12] [47,22,2] [31,14,3]    [32,11,2]
ccc  [12,7,4] [28,14,7] [11,2,1]    [19,14,7] 
定义模式:

val p = "^(d[1-7])h[0-9]{1,2}$".r
分组列:

import org.apache.spark.sql.functions._

val cols = df.columns.tail
  .groupBy { case p(d) => d }
  .map { case (c, cs) =>  {
    val sorted = sort_array(array(cs map col: _*), false)
    array(sorted(0), sorted(1), sorted(2)).as(c)
  }}
然后选择:

df.select($"id" +: cols.toSeq: _*)
定义模式:

val p = "^(d[1-7])h[0-9]{1,2}$".r
分组列:

import org.apache.spark.sql.functions._

val cols = df.columns.tail
  .groupBy { case p(d) => d }
  .map { case (c, cs) =>  {
    val sorted = sort_array(array(cs map col: _*), false)
    array(sorted(0), sorted(1), sorted(2)).as(c)
  }}
然后选择:

df.select($"id" +: cols.toSeq: _*)
import org.apache.spark.sql.functions_
var df=。。。
val first3=udf((list:Seq[Double])=>list.slice(0,3))
对于(i“d”+i+“h”+x)
df=df
.withColumn(“d”+i,first3(排序数组(数组(columns.head,columns.tail:*),false)))
.drop(列:*)
}
这会给你你想要的。事实上,每天我都会将24小时聚合到一个数组列中,按desc顺序排序,并从中选择前3个元素。

import org.apache.spark.sql.functions_
var df=。。。
val first3=udf((list:Seq[Double])=>list.slice(0,3))
对于(i“d”+i+“h”+x)
df=df
.withColumn(“d”+i,first3(排序数组(数组(columns.head,columns.tail:*),false)))
.drop(列:*)
}

这会给你你想要的。事实上,每天我都将24小时聚合到一个数组列中,我按desc顺序排序,并从中选择前3个元素。

似乎无法通过,因为first3(sort_数组(array(columns.head,columns.tail:*),false))返回排序后的列名,not VALUESOR.apache.spark.SparkException:无法执行用户定义的函数(anonfun$1:(array)=>array)它似乎无法通过,因为first3(sort_数组(array(columns.head,columns.tail:*),false))返回已排序的列名,而不是VALUESOR.apache.spark.SparkException:无法执行用户定义的函数(anonfun$1:(array)=>阵列)