подстрока из lastIndexOf в искре scala - PullRequest
0 голосов
/ 06 марта 2020

У меня есть столбец в моем фрейме данных, который содержит имя файла

test_1_1_1_202012010101101

Я хочу получить строку после lastIndexOf (_) Я попробовал это, и он работает

val timestamp_df =file_name_df.withColumn("timestamp",split(col("filename"),"_").getItem(4))

Но я хочу сделать его более обобщенным c, чтобы в будущем, если имя файла могло содержать любое число _, оно могло бы разбить его на основе lastIndexOf _

val timestamp_df =file_name_df.withColumn("timestamp", expr("substring(filename, length(filename)-15,17)"))

This также не является обобщенным c, так как длина символа может варьироваться.

Может кто-нибудь помочь мне в использовании функции lastIndexOf с withColumn.

Ответы [ 3 ]

1 голос
/ 06 марта 2020

Вы можете использовать функцию element_at с split, чтобы получить последний элемент массива.

Example:

df.withColumn("timestamp",element_at(split(col("filename"),"_"),-1)).show(false)
+--------------------------+---------------+
|filename                  |timestamp      |
+--------------------------+---------------+
|test_1_1_1_202012010101101|202012010101101|
+--------------------------+---------------+
0 голосов
/ 06 марта 2020
val timestamp_df =file_name_df.withColumn("timestamp",reverse(split(reverse(col("filename")),"_").getItem(0)))

Это работает с этим.

0 голосов
/ 06 марта 2020

Вы можете использовать substring_index

scala> val df = Seq(("a-b-c", 1),("d-ef-foi",2)).toDF("c1","c2")
df: org.apache.spark.sql.DataFrame = [c1: string, c2: int]

+--------+---+
|      c1| c2|
+--------+---+
|   a-b-c|  1|
|d-ef-foi|  2|
+--------+---+

scala> df.withColumn("c3", substring_index(col("c1"), "-", -1)).show
+--------+---+---+
|      c1| c2| c3|
+--------+---+---+
|   a-b-c|  1|  c|
|d-ef-foi|  2|foi|
+--------+---+---+

За документы : когда последний аргумент "отрицателен, все справа от конечного разделителя (считая справа) равно вернулся "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...