计算 PySpark SQL Join 中每个不同值在列中出现的次数

Posted

技术标签:

【中文标题】计算 PySpark SQL Join 中每个不同值在列中出现的次数【英文标题】:Counting how many times each distinct value occurs in a column in PySparkSQL Join 【发布时间】:2019-11-10 15:09:29 【问题描述】:

我使用 PySpark SQL 将两张表连接在一起,一张包含犯罪地点数据和经度和纬度,另一个包含邮政编码及其对应的经度和纬度。

我想要解决的是如何计算每个邮政编码中发生的犯罪数量。我是 PySpark 的新手,我的 SQL 生锈了,所以我不确定我哪里出错了。

我曾尝试使用 COUNT(DISTINCT) 但这只是给了我不同邮政编码的总数。

mySchema = StructType([StructField("Longitude", StringType(),True), StructField("Latitude", StringType(),True)])

bgl_df = spark.createDataFrame(burglary_rdd, mySchema)

bgl_df.registerTempTable("bgl")

rdd2 = spark.sparkContext.textFile("posttrans.csv")

mySchema2 = StructType([StructField("Postcode", StringType(),True), StructField("Lon", StringType(),True), StructField("Lat", StringType(),True)])

pcode_df = spark.createDataFrame(pcode_rdd, mySchema2)

pcode_df.registerTempTable("pcode")

count = spark.sql("SELECT COUNT(DISTINCT pcode.Postcode) 
                   FROM pcode RIGHT JOIN bgl 
                   ON (bgl.Longitude = pcode.Lon 
                   AND bgl.Latitude = pcode.Lat)")

+------------------------+
|count(DISTINCT Postcode)|
+------------------------+
|                  523371|
+------------------------+

相反,我想要类似的东西:

+--------+---+
|Postcode|Num|
+--------+---+
|LN11 9DA| 2 |
|BN10 8JX| 5 |
| EN9 3YF| 9 |
|EN10 6SS| 1 |
+--------+---+

【问题讨论】:

【参考方案1】:

您可以通过 groupby 计数来获取列的不同值:

group_df = df.groupby("Postcode").count()

你会得到你想要的输出。

对于 SQL 查询:

query =  """
         SELECT pcode.Postcode, COUNT(pcode.Postcode) AS Num
         FROM pcode 
         RIGHT JOIN bgl 
         ON (bgl.Longitude = pcode.Lon AND bgl.Latitude = pcode.Lat)
         GROUP BY pcode.Postcode
         """

count = spark.sql(query)

另外,我已从您的 FROMJOIN 子句中复制,以使查询与 copy-pasta 更相关。

【讨论】:

非常感谢,这正是我正在寻找的!

以上是关于计算 PySpark SQL Join 中每个不同值在列中出现的次数的主要内容,如果未能解决你的问题,请参考以下文章

计算pyspark中每个起点到目的地的最小距离

SQL Join与子查询计算不同表中具有相同ID的记录数

SQL - 使用 Union All 和 Join 计算

SQL JOIN 重复行

将 SQL 连接查询转换为 pyspark 语法

计算文本行中每个单词出现的频率-Pyspark