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
apachespark-scalaapi-aggregationonsequentiallyingkey_Scala_Apache Spark - Fatal编程技术网

apachespark-scalaapi-aggregationonsequentiallyingkey

apachespark-scalaapi-aggregationonsequentiallyingkey,scala,apache-spark,Scala,Apache Spark,我有一个数据框,看起来像这样: val df = sc.parallelize(Seq( (3,1,"A"),(3,2,"B"),(3,3,"C"), (2,1,"D"),(2,2,"E"), (3,1,"F"),(3,2,"G"),(3,3,"G"), (2,1,"X"),(2,2,"X") )).toDF("TotalN", "N", "String") +------+---+------+ |TotalN| N|String| +------+---+------+

我有一个数据框,看起来像这样:

val df = sc.parallelize(Seq(
  (3,1,"A"),(3,2,"B"),(3,3,"C"),
  (2,1,"D"),(2,2,"E"),
  (3,1,"F"),(3,2,"G"),(3,3,"G"),
  (2,1,"X"),(2,2,"X")
)).toDF("TotalN", "N", "String")

+------+---+------+
|TotalN|  N|String|
+------+---+------+
|     3|  1|     A|
|     3|  2|     B|
|     3|  3|     C|
|     2|  1|     D|
|     2|  2|     E|
|     3|  1|     F|
|     3|  2|     G|
|     3|  3|     G|
|     2|  1|     X|
|     2|  2|     X|
+------+---+------+
我需要通过基于TotalN和顺序递增的ID(N)将字符串连接在一起来聚合字符串。问题是我可以分组的每个聚合没有唯一的ID。所以,我需要做一些类似于“对于每一行,查看TotalN,循环通过接下来的N行并连接,然后重置”的事情

非常感谢任何指点


使用Spark 2.3.1和Scala Api。

解决方案是使用
行数
函数计算分组变量,该函数可在以后的groupBy中使用

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.row_number

var w = Window.orderBy("TotalN")
df.withColumn("GeneratedID", $"N" - row_number.over(w)).show

+------+---+------+-----------+
|TotalN|  N|String|GeneratedID|
+------+---+------+-----------+
|     2|  1|     D|          0|
|     2|  2|     E|          0|
|     2|  1|     X|         -2|
|     2|  2|     X|         -2|
|     3|  1|     A|         -4|
|     3|  2|     B|         -4|
|     3|  3|     C|         -4|
|     3|  1|     F|         -7|
|     3|  2|     G|         -7|
|     3|  3|     G|         -7|
+------+---+------+-----------+

解决方案是使用
行数
函数计算分组变量,该函数可在以后的groupBy中使用

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.row_number

var w = Window.orderBy("TotalN")
df.withColumn("GeneratedID", $"N" - row_number.over(w)).show

+------+---+------+-----------+
|TotalN|  N|String|GeneratedID|
+------+---+------+-----------+
|     2|  1|     D|          0|
|     2|  2|     E|          0|
|     2|  1|     X|         -2|
|     2|  2|     X|         -2|
|     3|  1|     A|         -4|
|     3|  2|     B|         -4|
|     3|  3|     C|         -4|
|     3|  1|     F|         -7|
|     3|  2|     G|         -7|
|     3|  3|     G|         -7|
+------+---+------+-----------+
试试这个:

val df = spark.sparkContext.parallelize(Seq(
  (3, 1, "A"), (3, 2, "B"), (3, 3, "C"),
  (2, 1, "D"), (2, 2, "E"),
  (3, 1, "F"), (3, 2, "G"), (3, 3, "G"),
  (2, 1, "X"), (2, 2, "X")
)).toDF("TotalN", "N", "String")


df.createOrReplaceTempView("data")

val sqlDF = spark.sql(
  """
    | SELECT TotalN d, N, String, ROW_NUMBER() over (order by TotalN) as rowNum
    | FROM data
  """.stripMargin)

sqlDF.withColumn("key", $"N" - $"rowNum")
  .groupBy("key").agg(collect_list('String).as("texts")).show()
试试这个:

val df = spark.sparkContext.parallelize(Seq(
  (3, 1, "A"), (3, 2, "B"), (3, 3, "C"),
  (2, 1, "D"), (2, 2, "E"),
  (3, 1, "F"), (3, 2, "G"), (3, 3, "G"),
  (2, 1, "X"), (2, 2, "X")
)).toDF("TotalN", "N", "String")


df.createOrReplaceTempView("data")

val sqlDF = spark.sql(
  """
    | SELECT TotalN d, N, String, ROW_NUMBER() over (order by TotalN) as rowNum
    | FROM data
  """.stripMargin)

sqlDF.withColumn("key", $"N" - $"rowNum")
  .groupBy("key").agg(collect_list('String).as("texts")).show()

我认为这里的问题是,在数据分发时,您要聚合的顺序问题!你能再解释一下你想要实现什么吗?从你所说的,TotalN不在其中-它只是基于N的序列进行聚合。。。序列结束后,立即启动新的aggregrationHi@proximator Yes,关注数据在不同工作人员之间的分布。我需要做的是聚合(连接)一个字符串以进行下游的进一步处理,但我仅有的分组变量是TotalN(stringx拆分的行数)和用于该聚合的按顺序递增的行数。输入文件中的行顺序与N序列有关。从某种意义上说,每条信息都是1,2,3,而不是2,3,1或3,2,1@JoelBerkeley-是的,正是问题所在,我只是不确定这样做的“火花方式”,而且在一台机器上有太多的数据。。。我是Spark的新手,因此可能有一些明显的地方我遗漏了。请参见ie添加一列,该列为(N-rowNumber),然后按该列分组。我认为这里的问题是,在分发数据时,您要聚合的顺序问题!你能再解释一下你想要实现什么吗?从你所说的,TotalN不在其中-它只是基于N的序列进行聚合。。。序列结束后,立即启动新的aggregrationHi@proximator Yes,关注数据在不同工作人员之间的分布。我需要做的是聚合(连接)一个字符串以进行下游的进一步处理,但我仅有的分组变量是TotalN(stringx拆分的行数)和用于该聚合的按顺序递增的行数。输入文件中的行顺序与N序列有关。从某种意义上说,每条信息都是1,2,3,而不是2,3,1或3,2,1@JoelBerkeley-是的,正是问题所在,我只是不确定这样做的“火花方式”,而且在一台机器上有太多的数据。。。我是Spark的新手,所以可能有一些明显的地方我遗漏了