计算每个不同值在 Spark SQL Join 的列中出现的次数
Counting how many times each distinct value occurs in a column in PySparkSQL Join
我使用 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 |
+--------+---+
您可以执行 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)
此外,我从您的 FROM
和 JOIN
子句中复制过来,使查询与 copy-pasta 更相关。
我使用 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 |
+--------+---+
您可以执行 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)
此外,我从您的 FROM
和 JOIN
子句中复制过来,使查询与 copy-pasta 更相关。