使用带有Python的spark 2.3.2,我尝试在一行中应用某些过滤器后实现“别名”以连接两个数据帧,如以下代码所示。但是它抛出错误以下
代码:
orders.filter(orders.order_status.isin("CLOSED","COMPLETE")).select("order_id","order_date").alias("a").\
join(orderitems.select("order_item_order_id","order_item_subtotal").alias("b"),a.order_id==b.order_item_order_id).\
drop(b.order_item_order_id)
错误:
NameError: name 'a' is not defined
我需要从dataframe:orders获取CLOSED和COMPLETE订单,然后在同一步骤中,我需要将结果数据框与另一个dataframe:orderitems连接起来,然后删除重复的列。因此,我正在寻找对数据框实现“别名”,就像对SQL中的表的别名一样。谁能帮助我了解我要去哪里错了?
答案 0 :(得分:2)
您不需要别名-您可以在drop指令中指定orderitems.order_item_order_id
,并在joing语句中指定order.order_id==orderitems.order_item_order_id
如果您想使用较短的名称,可以将其分解为多个语句(整体执行将是相同的,因为spark稍后会生成执行计划)
a=orders.filter(orders.order_status.isin("CLOSED","COMPLETE")).select("order_id","order_date")
b=orderitems.select("order_item_order_id","order_item_subtotal")
然后可以在加入和删除操作中使用a
和b
答案 1 :(得分:0)
尝试在 col(alias.col_name)
中提供您的列名。
orders\
.filter(orders.order_status.isin("CLOSED","COMPLETE"))\
.select("order_id","order_date").alias("a")\
.join(orderitems.select("order_item_order_id","order_item_subtotal")\
.alias("b"),col("a.order_id")== col("b.order_item_order_id"))
尝试使用它会起作用