我想做的是:
使用各自的A
列B
和id
加入两个数据框a_id
和b_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")
要做到这一点,但我想更像上面的伪代码。
答案 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”列连接起来。