Подсчет, сколько раз каждое отдельное значение встречается в столбце в PySparkSQL Join - PullRequest
0 голосов
/ 10 ноября 2019

Я использовал 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 Ответ

1 голос
/ 10 ноября 2019

Вы можете выполнить групповой подсчет, чтобы получить различное количество значений для столбца:

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 .

...