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です(たとえば)。
基本的に、すべての列を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になります。