Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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_Apache Spark Sql - Fatal编程技术网

Scala 如何在Spark数据帧上高效地执行此列操作?

Scala 如何在Spark数据帧上高效地执行此列操作?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个数据框,如下所示: +---+---+---+ | F1| F2| F3| +---+---+---+ | x| y| 1| | x| z| 2| | x| a| 4| | x| a| 4| | x| y| 1| | t| y2| 6| | t| y3| 4| | t| y4| 5| +---+---+---+ 我想添加另一列,其值为(每个唯一“F3”的“F1”和“F2”的唯一行数/“F1”和“F2”的唯一行总数) 例如,对于上表,下面是所需的

我有一个数据框,如下所示:

+---+---+---+
| F1| F2| F3|
+---+---+---+
|  x|  y|  1|
|  x|  z|  2|
|  x|  a|  4|
|  x|  a|  4|
|  x|  y|  1|
|  t| y2|  6|
|  t| y3|  4|
|  t| y4|  5|
+---+---+---+
我想添加另一列,其值为(
每个唯一“F3”的“F1”和“F2”的唯一行数/“F1”和“F2”的唯一行总数

例如,对于上表,下面是所需的新数据帧:

+---+---+---+----+
| F1| F2| F3|  F4|
+---+---+---+----+
|  t| y4|  5| 1/6|
|  x|  y|  1| 1/6|
|  x|  y|  1| 1/6|
|  x|  z|  2| 1/6|
|  t| y2|  6| 1/6|
|  t| y3|  4| 2/6|
|  x|  a|  4| 2/6|
|  x|  a|  4| 2/6|
+---+---+---+----+
注:在
F3=4
的情况下,只有
2
唯一
F1
F2
=
{(t,y3)、(x,a)}
。因此,对于所有出现的
F3=4
F4
将是
2/(F1和F2的唯一有序对的总数。这里有6个这样的对)


如何在Spark Scala中实现上述转换?

我刚刚学会了如何解决您的问题,即在数据帧上执行窗口时不能使用不同的函数

因此,我所做的是创建一个临时数据框,并将其与初始数据框连接,以获得您想要的结果:

case class Dog(F1:String, F2: String, F3: Int)
val df = Seq(Dog("x", "y", 1), Dog("x", "z", 2), Dog("x", "a", 4), Dog("x", "a", 4), Dog("x", "y", 1), Dog("t", "y2", 6), Dog("t", "y3", 4), Dog("t", "y4", 5)).toDF
val unique_F1_F2 = df.select("F1", "F2").distinct.count
val dd = df.withColumn("X1", concat(col("F1"), col("F2")))
           .groupBy("F3")
           .agg(countDistinct(col("X1")).as("distinct_count"))
val final_df = dd.join(df, "F3")
                 .withColumn("F4", col("distinct_count")/unique_F1_F2)
                 .drop("distinct_count")
final_df.show
+---+---+---+-------------------+
| F3| F1| F2|                 F4|
+---+---+---+-------------------+
|  1|  x|  y|0.16666666666666666|
|  1|  x|  y|0.16666666666666666|
|  6|  t| y2|0.16666666666666666|
|  5|  t| y4|0.16666666666666666|
|  4|  t| y3| 0.3333333333333333|
|  4|  x|  a| 0.3333333333333333|
|  4|  x|  a| 0.3333333333333333|
|  2|  x|  z|0.16666666666666666|
+---+---+---+-------------------+
我希望这是你所期望的


编辑:我将df.count更改为unique_F1_F2

max(rank())和orderBy($“F1”,$“F2”desc)如何?在时间和空间复杂度方面,哪一个更有效?另外,为什么F3=4时f4=0.25。如问题描述中所述,它应该是F4=2/6=0.33333333,因为所有F3=4出现在(F1,F2)的两个唯一对中,即,{(x,a)、(t,y3)},在(F1,F2)={(x,y)、(t,y2)、(t,y4)、(t,y3)、(x,a)、(x,z)}的所有6个唯一有序对中,F4应该是1/6=0.16666666,由于在6个唯一(F1,F2)对中,只有1个F1和F2的“唯一”有序对出现F3=1我的错误我不想知道唯一F1/F2的计数,我将用df.count更改最后一行