Pypark排序排序的

2024-04-20 15:17:14 发布

您现在位置:Python中文网/ 问答频道 /正文

请帮助初学者。 通常db用于下单,全部在一张表中。你知道吗

使用Python分析apachespark中的数据。希望编写一个查询,该查询将提取按电子邮件排序的客户的所有交易,这些客户订购了现在已停产的产品,并且有尚未发货的订单。基本上,对于“&item\u in\u list(F.lit(“NotShipped”),ShippedStatus)”它不起作用。你知道吗

%python
import pyspark.sql.functions as F
from pyspark.sql.types import *

list_len = F.udf(lambda x: len(x), IntegerType())
item_in_list = F.udf(lambda x, y: x in y, BooleanType())
df = spark.sql("select * from orderdb")
df1 = df.select("email", "OrderedProduct","ShippedStatus").groupBy("email")
df1 = df1.agg(F.collect_set("OrderedProduct"))\
       .withColumnRenamed("collect_set(OrderedProduct)", "OrderedProduct")
df1 = df1.filter((list_len(df1.OrderedProduct) > 1) & 
               item_in_list(F.lit("DiscontinuedProduct"), OrderedProduct) 
        &item_in_list(F.lit("NotShipped"), ShippedStatus)

df1 = df1.select("email")
df = df1.join(df, "email", "left_outer")
display(df)

ID字符串为空 日期时间戳为空 OrderedProduct字符串为空 ShippedStatus布尔值为空


Tags: inimportdfsql客户lenemailitem
1条回答
网友
1楼 · 发布于 2024-04-20 15:17:14

首先,udf在pyspark中的表现非常糟糕。如果要更改类型,请使用以下命令:

from pyspark.sql.types import IntegerType

df = df.withColumn("column", df["column"].cast(IntegerType()))

也就是说,我们需要一个可复制的例子,但是我想你可以用'where'子句来解决这个问题。你知道吗

# Your code
df1 = df1.filter((list_len(df1.OrderedProduct) > 1) & 
               item_in_list(F.lit("DiscontinuedProduct"), OrderedProduct) 
        &item_in_list(F.lit("NotShipped"), ShippedStatus)

# My code
condition1 = F.col('OrderedProduct') > 1
condition2 = F.col('ShippedStatus') == F.lit('NotShipped')
condition3 = F.col('OrderedProduct') == F.lit('DiscontinuedProduct')

df1 = df1.where(condition 1 & condition2 & condition3)

相关问题 更多 >