如何使用 scala/python/spark 在 CSV 文件中创建新的时间戳(分钟)列
Posted
技术标签:
【中文标题】如何使用 scala/python/spark 在 CSV 文件中创建新的时间戳(分钟)列【英文标题】:How to create a new timestamp(minute) column in a CSV file using scala/python/spark 【发布时间】:2020-06-22 09:56:21 【问题描述】:我有一个 CSV 文件,我想创建一个新的分钟时间戳列,如下所示
实际:
Col1, Col2
1.19185711131486, 0.26615071205963
-1.3598071336738, -0.0727811733098497
-0.966271711572087, -0.185226008082898
-0.966271711572087, -0.185226008082898
-1.15823309349523, 0.877736754848451
-0.425965884412454, 0.960523044882985
预期:
Col1, Col2, ts
1.19185711131486, 0.26615071205963, 00:00:00
-1.3598071336738, -0.0727811733098497, 00:01:00
-0.966271711572087, -0.185226008082898, 00:02:00
-0.966271711572087, -0.185226008082898, 00:03:00
-1.15823309349523, 0.877736754848451, 00:04:00
-0.425965884412454, 0.960523044882985, 00:05:00
提前致谢!
【问题讨论】:
如何建立分钟列? @Rolintocour 这就是我发布问题的原因。 @Rolintocour 的意思是您可以用文字(在问题正文中)解释预期输出背后的逻辑(ts 列) 【参考方案1】:也许这很有用 -
val data =
"""
|Col1, Col2
|1.19185711131486, 0.26615071205963
|-1.3598071336738, -0.0727811733098497
|-0.966271711572087, -0.185226008082898
|-0.966271711572087, -0.185226008082898
|-1.15823309349523, 0.877736754848451
|-0.425965884412454, 0.960523044882985
""".stripMargin
val stringDS = data.split(System.lineSeparator())
.map(_.split("\\,").map(_.replaceAll("""^[ \t]+|[ \t]+$""", "")).mkString(","))
.toSeq.toDS()
val df = spark.read
.option("sep", ",")
.option("inferSchema", "true")
.option("header", "true")
.option("nullValue", "null")
.csv(stringDS)
df.printSchema()
df.show(false)
/**
* root
* |-- Col1: double (nullable = true)
* |-- Col2: double (nullable = true)
*
* +------------------+-------------------+
* |Col1 |Col2 |
* +------------------+-------------------+
* |1.19185711131486 |0.26615071205963 |
* |-1.3598071336738 |-0.0727811733098497|
* |-0.966271711572087|-0.185226008082898 |
* |-0.966271711572087|-0.185226008082898 |
* |-1.15823309349523 |0.877736754848451 |
* |-0.425965884412454|0.960523044882985 |
* +------------------+-------------------+
*/
df.withColumn("ts",
date_format(to_timestamp((row_number().over(Window.orderBy(df.columns.map(col): _*)) - 1).cast("string"),
"mm")
, "00:mm:00"))
.show(false)
/**
* +------------------+-------------------+--------+
* |Col1 |Col2 |ts |
* +------------------+-------------------+--------+
* |-1.3598071336738 |-0.0727811733098497|00:00:00|
* |-1.15823309349523 |0.877736754848451 |00:01:00|
* |-0.966271711572087|-0.185226008082898 |00:02:00|
* |-0.966271711572087|-0.185226008082898 |00:03:00|
* |-0.425965884412454|0.960523044882985 |00:04:00|
* |1.19185711131486 |0.26615071205963 |00:05:00|
* +------------------+-------------------+--------+
*/
【讨论】:
它在“00:59:00”之前工作正常,然后显示“null”。实际上这是一个示例数据,我想为数千条记录生成它。 有时间我会检查它..但为什么它被否决 抱歉,我不确定。还有人投了反对票。但是你的信息对我真的很有用。 同意。嗨@Sudhakar,您为什么不能提供获取ts
列的逻辑?这将反过来帮助您获得高质量的答案
@Sudhakar,您对00:59:00
值之后的行有什么期望?以上是关于如何使用 scala/python/spark 在 CSV 文件中创建新的时间戳(分钟)列的主要内容,如果未能解决你的问题,请参考以下文章
如何在你的库中使用 Spring-Data 以及如何在你的项目中使用这个库?