加入两个连接键不同的DataFrame,只选择一些列

时间:2018-04-06 04:47:02

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

我想做的是:

使用各自的ABid加入两个数据框a_idb_id。我想选择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")

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

3 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

试试这个解决方案:

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中的以下行显示了从表B中选择A列和2列中的所有列的技巧。

[col('a.'+xx) for xx in a.columns] : all columns in a

[col('b.other1'),col('b.other2')] : some columns of b

答案 2 :(得分:1)

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

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

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