如何在pyspark中对数据框(而不是数据框列)实施“别名”

时间:2019-02-17 08:13:11

标签: apache-spark pyspark

使用带有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中的表的别名一样。谁能帮助我了解我要去哪里错了?

2 个答案:

答案 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")

然后可以在加入和删除操作中使用ab

答案 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"))

尝试使用它会起作用