如何将两个数据框连接在一起

时间:2020-06-19 13:48:07

标签: pyspark apache-spark-sql pyspark-dataframes

我有两个数据框。

一个来自groupBy,另一个是总摘要:

a = data.groupBy("bucket").agg(sum(a.total))
b = data.agg(sum(a.total))

我想将b中的总数放入一个数据帧,以便可以计算每个存储桶中的百分比。

您知道我将使用哪种联接吗?

2 个答案:

答案 0 :(得分:3)

使用.crossJoin,然后将b的总和添加到df a的所有行中,然后可以计算百分比。

Example:

a.crossJoin(b).show()
#+------+----------+----------+
#|bucket|sum(total)|sum(total)|
#+------+----------+----------+
#|     c|         4|        10|
#|     b|         3|        10|
#|     a|         3|        10|
#+------+----------+----------+

您可以尝试使用如下所述的窗口函数来代替 CrossJoin

df.show()
#+-----+------+
#|total|bucket|
#+-----+------+
#|    1|     a|
#|    2|     a|
#|    3|     b|
#|    4|     c|
#+-----+------+

from pyspark.sql.functions import *
from pyspark.sql import *
from pyspark.sql.window import *
import sys

w=Window.partitionBy(col("bucket"))
w1=Window.orderBy(lit("1")).rowsBetween(-sys.maxsize,sys.maxsize)

df.withColumn("sum_b",sum(col("total")).over(w)).withColumn("sum_c",sum(col("total")).over(w1)).show()
#+-----+------+-----+-----+
#|total|bucket|sum_b|sum_c|
#+-----+------+-----+-----+
#|    4|     c|    4|   10|
#|    3|     b|    3|   10|
#|    1|     a|    3|   10|
#|    2|     a|    3|   10|
#+-----+------+-----+-----+

答案 1 :(得分:0)

您还可以使用collect(),因为您将返回驱动程序只是一个简单的结果

from pyspark.sql import SparkSession
from pyspark.sql.functions import *
spark = SparkSession.builder.getOrCreate()
df = spark.sql("select 'A' as bucket, 5 as value union all select 'B' as bucket, 8 as value")
df_total = spark.sql("select 9 as total")
df=df.withColumn('total',lit(df_total.collect()[0]['total']))

+------+-----+-----+
|bucket|value|total|
+------+-----+-----+
|     A|    5|    9|
|     B|    8|    9|
+------+-----+-----+

df= df.withColumn('pourcentage', col('total') / col('value'))

+------+-----+-----+-----------+
|bucket|value|total|pourcentage|
+------+-----+-----+-----------+
|     A|    5|    9|        1.8|
|     B|    8|    9|      1.125|
+------+-----+-----+-----------+