Pyspark - 如何拆分具有 Datetime 类型的结构值的列?

Posted

技术标签:

【中文标题】Pyspark - 如何拆分具有 Datetime 类型的结构值的列?【英文标题】:Pyspark - How do you split a column with Struct Values of type Datetime? 【发布时间】:2018-06-07 05:44:42 【问题描述】:

我有以下代码创建窗口并在窗口中聚合值。

df.groupBy(window("time", "30 minutes"))\
  .agg(func.countDistinct("customer_numbers")

窗口列(保存时间段的列)现在是一个具有两个日期时间的结构。

[datetime1, datetime2]. 

我的数据框如下所示:

window                                       customer_numbers
[2018-02-04:10:00:00, 2018-02-04:10:30:00]          10
[2018-02-04:10:30:00, 2018-02-04:11:00:00]          15

我希望它看起来像这样

start                             End               customer_numbers
2018-02-04:10:00:00        2018-02-04:10:30:00        10
2018-02-04:10:30:00        2018-02-04:11:00:00        15

我想把它分成两列并去掉原来的窗口列,但我似乎找不到这样做的方法。我尝试使用 UDF,尽管我认为在 scala 中你可以简单地做一些事情,比如在 pyspark 中获取我不知道如何执行此操作的第一项。我尝试添加一个 UDF,但它没有给我第一个值,而是给了我一个日历。

.withColumn("key", $"window"._1)

有谁知道我如何做到这一点?

【问题讨论】:

Querying Spark SQL DataFrame with complex types的可能重复 【参考方案1】:

你可以简单地使用select函数作为

.select(func.col('window')[0].alias('start'), func.col('window')[1].alias('end'), func.col('customer_numbers')).drop('window')

【讨论】:

感谢工作,尽管我必须明确命名结构类型而不是使用 [0] 和 [1]

以上是关于Pyspark - 如何拆分具有 Datetime 类型的结构值的列?的主要内容,如果未能解决你的问题,请参考以下文章

按日期将pyspark数据集分成两个[重复]

PySpark如何读取具有多种编码的字符串的文件

如何将向量拆分为列 - 使用 PySpark

如何在 pyspark 上创建分层拆分训练、验证和测试集?

在 pyspark 中的 datetime64 和 datetime 之间转换

如何在 PySpark 中拆分数据框列