我有以下 3 个表:
'---- groupedFlightData show(10) -----'
+-----------------+----+------------+
|dest_country_name|year|flight_count|
+-----------------+----+------------+
| Saint Lucia|2011| 102|
| Hungary|2014| 2|
| Guadeloupe|2014| 43|
| Nigeria|2014| 49|
| Fiji|2015| 24|
| Kuwait|2010| 26|
| Cayman Islands|2011| 251|
| Paraguay|2011| 85|
| Austria|2011| 34|
| Gibraltar|2014| 1|
+-----------------+----+------------+
'---- sumAllTrips -----'
+-----------+
|total_count|
+-----------+
| 2352430|
+-----------+
'---- TPY -----'
+----+----------+
|year|year_count|
+----+----------+
|2012| 422180|
|2014| 436855|
|2013| 417869|
|2011| 428426|
|2015| 453316|
|2010| 422269|
+----+----------+
我想使用 pyspark SQL 将它们全部连接起来,并且需要结果表是:
'---- stats show(10) -----'
+-----------+----+------------+-------+----------+
| Country|year|flight_count| total|year_count|
+-----------+----+------------+-------+----------+
|Afghanistan|2011| 8|2352430| 390663|
|Afghanistan|2012| 5|2352430| 385290|
|Afghanistan|2010| 11|2352430| 385450|
| Algeria|2015| 4|2352430| 411966|
| Algeria|2014| 9|2352430| 398022|
| Algeria|2013| 2|2352430| 381039|
| Angola|2015| 15|2352430| 411966|
| Angola|2014| 13|2352430| 398022|
| Angola|2011| 13|2352430| 390663|
| Angola|2012| 12|2352430| 385290|
+-----------+----+------------+-------+----------+
我尝试了以下代码:
sqlQuery = spark.sql("""
SELECT groupedFlightData.dest_country_name AS Country, groupedFlightData.year, groupedFlightData.flight_count , TPY.year_count
FROM groupedFlightData
FULL JOIN TPY ON TPY.year=groupedFlightData.year
ORDER BY Country
""")
这是不完整的,我不知道如何在没有ID的情况下加入第三个表sumAllTrips以及如何将其包含在同一个查询中。我的最终代码必须全部使用 SQL 查询,不允许使用 RDD 或基于 DF 的语法
你需要的
Whan称为笛卡尔连接,你可以在Spark SQL中与CROSS JOIN
一起使用。扩展查询可能如下所示:
sqlQuery = spark.sql("""
SELECT groupedFlightData.dest_country_name AS Country,
groupedFlightData.year,
groupedFlightData.flight_count,
sumAllTrips.total_count AS total,
TPY.year_count
FROM groupedFlightData
FULL JOIN TPY ON TPY.year=groupedFlightData.year
CROSS JOIN sumAllTrips
ORDER BY Country
""")