web-dev-qa-db-ja.com

SPARK SQLの重複行の数を数える

HiveテーブルのSparkSQLで重複行の数をカウントする必要があるという要件があります。

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です(たとえば)。

7
Nandu

基本的に、すべての列を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より大きい行のみをフィルタリングし、合計を選択します。この場合、最初の2行が合計4になります。

11
pault