【问题标题】:Join two DataFrames where the join key is different and only select some columns连接两个连接键不同的DataFrame,只选择一些列
【发布时间】:2018-09-16 01:12:05
【问题描述】:

我想做的是:

使用它们各自的ida_idb_id 连接两个DataFrames AB。我想从A 中选择所有列,从B 中选择两个特定列

我尝试了类似我在下面加上不同引号的内容,但仍然无法正常工作。我觉得在 pyspark 中,应该有一个简单的方法来做到这一点。

A_B = A.join(B, A.id == B.id).select(A.*, B.b1, B.b2)

我知道你会写

A_B = sqlContext.sql("SELECT A.*, B.b1, B.b2 FROM A JOIN B ON A.a_id = B.b_id")

要这样做,但我想更像上面的伪代码。

【问题讨论】:

    标签: apache-spark join pyspark spark-dataframe pyspark-sql


    【解决方案1】:

    我认为更简单的解决方案是将表 A 与表 B 与您想要的选定列连接起来。这是执行此操作的示例代码:

    joined_tables = table_A.join(table_B.select('col1', 'col2', 'col3'), ['id'])
    

    上面的代码将 table_A 中的所有列和 table_B 中的列“col1”、“col2”、“col3”连接起来。

    【讨论】:

      【解决方案2】:

      您的伪代码基本上是正确的。如果两个 DataFrame 中都存在 id 列,则此稍作修改的版本将起作用:

      A_B = A.join(B, on="id").select("A.*", "B.b1", "B.b2")
      

      来自pyspark.sql.DataFrame.join() 的文档:

      如果on 是字符串或字符串列表,表示连接的名称 列,列必须存在于两边,这执行 等值连接。

      由于键不同,你可以使用withColumn()(或withColumnRenamed())在两个DataFrame中创建一个同名的列:

      A_B = A.withColumn("id", col("a_id")).join(B.withColumn("id", col("b_id")), on="id")\
          .select("A.*", "B.b1", "B.b2")
      

      如果您的 DataFrame 名称很长很复杂,您还可以使用 alias() 来简化操作:

      A_B = long_data_frame_name1.alias("A").withColumn("id", col("a_id"))\
          .join(long_data_frame_name2.alias("B").withColumn("id", col("b_id")), on="id")\
          .select("A.*", "B.b1", "B.b2")
      

      【讨论】:

      • 您好 Pault,感谢您的帮助!但是,我的 A 和 B 表中的两个 id 列具有不同的名称(例如 a_id 和 b_id)。我想知道你的方法是否仍然有效?我今天会自己做一个检查,但我觉得我在你的格式中尝试了类似的方法,但没有使用 on=,它似乎不起作用。 )
      • @ASU_TY 我已经用解决您问题的方法更新了答案。
      • 我试过了,但对我不起作用。由于某些原因,我的控制台似乎不喜欢这种格式(“A.*”、“B.b1”、“B.b2”)
      • 您可以编辑您的问题并显示您使用的确切代码和完整的 Traceback 吗?如果可能,请尝试提供minimal reproducible example。如果您使用的是 Spark 和 python,还请包括哪个版本。
      【解决方案3】:

      试试这个解决方案:

      A_B = A.join(B,col('B.id') == col('A.id')).select([col('A.'+xx) for xx in A.columns]
            + [col('B.other1'),col('B.other2')])
      

      SELECT 中的以下行起到了从 A 中选择所有列和从表 B 中选择 2 列的技巧。

      [col('a.'+xx) for xx in a.columns] : all columns in a
      
      [col('b.other1'),col('b.other2')] : some columns of b
      

      【讨论】:

      • 这是正确的答案 - 您不必重命名列来执行连接!
      猜你喜欢
      • 1970-01-01
      • 2017-04-10
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 2011-04-07
      • 2019-11-18
      • 1970-01-01
      相关资源
      最近更新 更多