簡體   English   中英

如何使用 Spark 數據框獲取某個范圍內 2 個表之間的日期差異

[英]How to get the date diff between 2 tables for a range using Spark dataframe

我正在嘗試將下面的 spark Sql 查詢轉換為 Spark Dataframe。

我有Orders(OrderID, CustomerID, EmployeeID, OrderDate, ShipperID)Shippers(ShipperID, ShipperName, OrderDate)

我的 Spark SQL 查詢列出了每個托運人發送的訂單數量:

 sqlContext.sql("SELECT Shippers.ShipperName, COUNT(Orders.ShipperID) 
    AS NumberOfOrders FROM Orders LEFT JOIN Shippers ON 
    Orders.ShipperID = Shippers.ShipperID  AND Shippers. OrderDate >= Orders.OrderDate 
    AND datediff(from_unixtime(cast(UNIX_TIMESTAMP(Shippers.OrderDate,
    'yyyy-MM-dd HH:mm:ss')as date)),from_unixtime(cast(UNIX_TIMESTAMP(Orders.
    OrderDate,'yyyy-MM-dd HH:mm:ss')as date))) BETWEEN 1 and 10 
    GROUP BY ShipperName")

我通過查詢轉換對整個連接組沒問題。問題在於日期時間轉換並獲得 1 到 10 天之間的差異。

這是我目前擁有的數據框。 但我的演員表出現錯誤

Shippers.alias("s").join(
    Orders.alias("o"),
    on = "ShipperID",
    how = "left"
).groupby(
    "s.ShipperName"
).select(datediff(from_unixtime(cast(unix_timestamp('OrderDate', 'yyyy-MM-dd HH:mm:ss').alias('unix_time'))).between(1,10))).agg(
    F.count(F.col("o.OrderID")).alias("NumberOfOrders")
).show()

有人可以幫我將上述 SQL 查詢重構為 Spark Dataframe 嗎?

您要執行的操作應該是這樣的:

import pyspark.sql.functions as F

Orders.alias('o').join(
    Shippers.alias('s'),
    on = ["ShipperId"],
    how = "left"
).filter(
    (
        F.col("s.OrderDate") >= F.col("o.OrderDate")
    ) &
    (
        F.datediff(
            F.from_unixtime(
                F.unix_timestamp(
                    F.col('s.OrderDate'),
                    'yyyy-MM-dd HH:mm:ss'
                )
            ).cast('date'),
            F.from_unixtime(
                F.unix_timestamp(
                    F.col('o.OrderDate'),
                    'yyyy-MM-dd HH:mm:ss'
                )
            ).cast('date')
        ).between(1,10)
    )

).groupby(
    "ShipperName"
).agg(
    F.count(F.col("o.ShipperID")).alias("NumberOfOrders")
)

根據錯誤可能會有一些變化,但邏輯應該是這樣的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM