如何使用 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 以及如何在你的项目中使用这个库?

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”

如何在发布管道中使用输出变量

如何在Hive&Impala中使用UDF

如何使用 Firebase 在 Web 上托管 Flutter?它的效果如何?

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]