如何根据一个字符和 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
我想拆分包含日期时间的列“_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