我正在處理具有struct如下所示型別列的PySpark 資料框:
df.printSchema()
#root
#|-- timeframe: struct (nullable = false)
#| |-- start: timestamp (nullable = true)
#| |-- end: timestamp (nullable = true)
因此,我嘗試collect()傳遞end相關列的時間戳/視窗來繪制問題:
from pyspark.sql.functions import *
# method 1
ts1 = [val('timeframe.end') for val in df.select(date_format(col('timeframe.end'),"yyyy-MM-dd")).collect()]
# method 2
ts2 = [val('timeframe.end') for val in df.select('timeframe.end').collect()]
所以通常當列不是結構時,我會遵循這個答案,但在這種情況下,除了這篇文章和他們試圖將其轉換為陣列的答案之外,我找不到更好的方法。我不確定這是最佳做法。
我嘗試了如上所示的 2 種方法均未成功,其輸出如下:
print(ts1) #[Row(2021-12-28='timeframe.end')]
print(ts2) #[Row(2021-12-28 00:00:00='timeframe.end')]
預期產出如下:
print(ts1) #[2021-12-28] just date format
print(ts2) #[2021-12-28 00:00:00] just timestamp format
我該如何處理這件事?
uj5u.com熱心網友回復:
您可以使用方括號 ( ) 或不帶括號的點 ( )訪問行欄位。試試這個:row["field"]row.field
from pyspark.sql import Row
import pyspark.sql.functions as F
df = spark.createDataFrame([Row(timeframe=Row(start="2021-12-28 00:00:00", end="2022-01-06 00:00:00"))])
ts1 = [r["end"] for r in df.select(F.date_format(F.col("timeframe.end"), "yyyy-MM-dd").alias("end")).collect()]
# or
# ts1 = [r.end for r in df.select(F.date_format(F.col("timeframe.end"), "yyyy-MM-dd").alias("end")).collect()]
print(ts1)
#['2022-01-06']
當您row("timeframe.end")實際呼叫該類時Row,這就是您獲得這些值的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/405136.html
標籤:
上一篇:pysparksql將日期格式從mm/dd/yyhh:mm或yyyy-mm-ddhh:mm:ss轉換為yyyy-mm-ddhh:mm格式
下一篇:在列中按相似名稱對行進行分組
