如何从 PySpark 数据框中的结构类型列中提取日期?
How can extract date from struct type column in PySpark dataframe?
我正在处理具有 struct
类型列的 PySpark 数据框,如下所示:
df.printSchema()
#root
#|-- timeframe: struct (nullable = false)
#| |-- start: timestamp (nullable = true)
#| |-- end: timestamp (nullable = true)
所以我尝试 collect()
并通过 end
timestamps/window 相关列来绘制问题:
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()]
所以通常当列不是结构时,我遵循这个 answer but in this case I couldn't find better ways except this and this answer 他们试图将它转换为数组。我不确定这是最佳做法。
我已经尝试了上面显示的 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
我该如何处理这件事?
您可以使用方括号 (row["field"]
) 或点 (row.field
) 而不是圆括号来访问 Row 字段。试试这个:
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")
时,您实际上调用了 class Row
这就是您获得这些值的原因。
我正在处理具有 struct
类型列的 PySpark 数据框,如下所示:
df.printSchema()
#root
#|-- timeframe: struct (nullable = false)
#| |-- start: timestamp (nullable = true)
#| |-- end: timestamp (nullable = true)
所以我尝试 collect()
并通过 end
timestamps/window 相关列来绘制问题:
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()]
所以通常当列不是结构时,我遵循这个 answer but in this case I couldn't find better ways except this
我已经尝试了上面显示的 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
我该如何处理这件事?
您可以使用方括号 (row["field"]
) 或点 (row.field
) 而不是圆括号来访问 Row 字段。试试这个:
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")
时,您实际上调用了 class Row
这就是您获得这些值的原因。