如何根据一个字符和 space 使用 scala 拆分列

How to split a column with scala based on one character and a space

我想拆分包含日期时间的列“_time”(如 fieldtype = string)

“_time”列中的日期如下所示:27-11-2017 08:20:33 所以我认为这可行:

    df.withColumn("col1", split(col("_time"), "\-").getItem(0))
  .withColumn("col2", split(col("_time"), "\-").getItem(1))
  .withColumn("col3", split(col("_time"), "\-").getItem(2))
  .withColumn("col4", split(col("_time"), "\' '").getItem(3))
  .show()

但这会导致:

-------------------+----+----+-------------+----+
              _time|col1|col2|         col3|col4|
-------------------+----+----+-------------+----+
27-11-2017 08:20:33|  27|  11|2017 08:20:33|null|
27-11-2017 08:20:35|  27|  11|2017 08:20:35|null|
27-11-2017 08:20:35|  27|  11|2017 08:20:35|null|

所以,它似乎对 space 没有任何作用。我试过使用这个:

.withColumn("col4", split(col("_time"), "\' '")

但这也行不通。 (给出相同的结果)

有什么建议吗?

此致

在方法split中使用|(在Regex中表示"or")来表示-whitespace都可以作为分隔符,如图以下:

val df = Seq(
  "27-11-2017 08:20:33", "28-12-2017 09:30:44"
).toDF("_time")

df.
  withColumn("tsArr", split($"_time", "\-|\s")).
  select($"tsArr"(0), $"tsArr"(1), $"tsArr"(2), $"tsArr"(3)).
  show
// +--------+--------+--------+--------+
// |tsArr[0]|tsArr[1]|tsArr[2]|tsArr[3]|
// +--------+--------+--------+--------+
// |      27|      11|    2017|08:20:33|
// |      28|      12|    2017|09:30:44|
// +--------+--------+--------+--------+

作为替代方案,您可以使用 date_format,例如

val newDf = df
  .withColumn("_time", unix_timestamp($"_time", "dd-MM-yyyy HH:mm:ss").cast("timestamp") )
  .select($"_time", date_format($"_time", "dd"), date_format($"_time", "MM")
    , date_format($"_time", "yyyy"), date_format($"_time", "HH")
    , date_format($"_time", "mm"), date_format($"_time", "ss")
         )

newDf.show

有关 date_format here and here 的更多信息。