Apache spark 在具有约束的DataFrame列中查找百分比

Apache spark 在具有约束的DataFrame列中查找百分比,apache-spark,pyspark,Apache Spark,Pyspark,我有一个由位置、类型和日期组成的数据框 d1=sc.parallelize([('a','b1','2015-01-07'), ('a','b2','2015-02-09'), ('c', 'b25', '2014-12-01'),('a','b2','2014-09-10'), ('c', 'b3','2015-02-21'),('a','b11','2015-09-12'), ('a','b7','2014-

我有一个由位置、类型和日期组成的数据框

d1=sc.parallelize([('a','b1','2015-01-07'), ('a','b2','2015-02-09'),
              ('c', 'b25', '2014-12-01'),('a','b2','2014-09-10'),
              ('c', 'b3','2015-02-21'),('a','b11','2015-09-12'),
              ('a','b7','2014-11-30'), ('c','b26','2014-03-09'),
              ('c', 'b30', '2015-11-28'),('a', 'b5', '2015-03-01'),
              ('c','b25','2015-11-29'),('c', 'b27','2014-01-17'),
              ('c', 'b16','2015-04-01'), ('a', 'b11','2014-01-19'),
              ('a','b7', '2015-09-29'), ('c', 'b12', '2014-08-20')]).toDF(['location',
                'type', 'date_str'])

d2=d1.withColumn('date',d1.date_str.cast('date')).drop('date_str')



|loaction|type|      date|
+--------+----+----------+
|       a|  b1|2015-01-07|
|       a|  b2|2015-02-09|
|       c| b25|2014-12-01|
|       a|  b2|2014-09-10|
|       c|  b3|2015-02-21|
|       a| b11|2015-09-12|
|       a|  b7|2014-11-30|
|       c| b26|2014-03-09|
|       c| b30|2015-11-28|
|       a|  b5|2015-03-01|
|       c| b25|2015-11-29|
|       c| b27|2014-01-17|
|       c| b16|2015-04-01|
|       a| b11|2014-01-19|
|       a|  b7|2015-09-29|
|       c| b12|2014-08-20|
+--------+----+----------+
我想得到2014年某一特定地点的类型百分比,2015年也出现在同一地点

在这种情况下,2014年位置“a”有3种不同的类型, b2、b7和b11。2015年,中国共有5种不同的类型 位置“a”、b1、b2、b11、b5和b7。所以在这三种类型中 2014年是谁,2015年也是谁,即100%(三分之三) 2015年

对于位置“c”,2014年有四种类型,b25、b26、b27和b12。 2015年,共有三种类型b30、b25和b16。2014年的类型数量 2015年也有25%(四分之一)

我正试图找回一个像这样的数据帧

|location|percent_retained|
+--------+----------------+
|       a|               1|
|       c|             .25|
+--------+----------------+
我可以做一个分组,以获得每年的原始计数,但这没有帮助,因为我只想知道2015年出现在2014年的类型的数量

d2=d2.withColumn('year', F.year(d2.date))
d2.groupBy('location', 'year').agg('type':'count')

我使用的是Spark 1.5,因此无法旋转数据帧。

像您那样提取年份,然后按
位置和
类型分组。然后,您可以映射年份列表(每个位置、每个类型),并应用所需的逻辑

据我所知,你可以有一年,或者两年。您只需将其转换为“保留”、“just-2014”、“just-2015”等标志,然后从中执行其余的计算