pyspark SQL DF,连接多个表,一个没有公共ID

时间:2017-11-05 12:26:16

标签: sql python-3.x pyspark apache-spark-sql spark-dataframe

我有以下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的语法

1 个答案:

答案 0 :(得分:1)

你需要的是笛卡尔连接,你可以在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
""")