计算SPARKSQL中重复行的数量

时间:2018-02-01 02:53:54

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

我需要在SparkSQL for Hive表中计算重复行数。

from pyspark import SparkContext, SparkConf
from pyspark.sql import HiveContext
from pyspark.sql.types import *
from pyspark.sql import Row
app_name="test"
conf = SparkConf().setAppName(app_name)
sc = SparkContext(conf=conf)
sqlContext = HiveContext(sc)
df = sqlContext.sql("select * from  DV_BDFRAWZPH_NOGBD_R000_SG.employee")

截至目前,我已经对表名进行了硬编码,但它实际上是作为参数提供的。话虽如此,我们也不知道列数或它们的名称。在python pandas中,我们有类似df.duplicated.sum()来计算重复记录的数量。我们这里有类似的东西吗?

+---+---+---+
| 1 | A | B |
+---+---+---+
| 1 | A | B |
+---+---+---+
| 2 | B | E |
+---+---+---+
| 2 | B | E |
+---+---+---+
| 3 | D | G |
+---+---+---+
| 4 | D | G |
+---+---+---+

此处重复行的数量为4.(例如)

1 个答案:

答案 0 :(得分:6)

您基本上希望groupBy()所有列和count(),然后选择计数大于1的行的计数总和。

import pyspark.sql.functions as f
df.groupBy(df.columns)\
    .count()\
    .where(f.col('count') > 1)\
    .select(f.sum('count'))\
    .show()

<强>解释

分组和聚合后,您的数据将如下所示:

+---+---+---+---+
| 1 | A | B | 2 |
+---+---+---+---+
| 2 | B | E | 2 |
+---+---+---+---+
| 3 | D | G | 1 |
+---+---+---+---+
| 4 | D | G | 1 |
+---+---+---+---+

然后使用where()仅过滤计数大于1的行,并选择总和。在这种情况下,您将获得前两行,总计为4。