Как пройти конкретный столбец в цикле данных - PullRequest
0 голосов
/ 28 января 2020

Привет, у меня есть следующий фрейм данных, такой как

df.show()

, который будет выводиться как

+----------+--------+-------+--------------------+-------+--------------------+
|      date|    time|from_to|      expression_col
+----------+--------+-------+--------------------+-------+--------------------+
|2019-11-08|05:55:41|   MO-N|test=LN,x23=test,x5=66,lastkey1=BN zzzTemporary59 0
|2019-11-08|05:55:41|   MO-N|test=LN,x23=test,x5=66,lastkey2=BN zzzTemporary59 0
|2019-11-08|05:55:41|   MO-N|test=LN,x23=test,x5=66,lastkey3=BN zzzTemporary59 0

Я пытаюсь пройти выражение_кол, основанное на последнем ключе с разделителями-запятыми перед знаком равенства ( =) это значение, как указано ниже

lastkey1
lastkey2
lastkey3

на основе этого значения, если ключом является lastkey1, то он попадает в категорию один, lastkey2 затем в категорию 2, и так далее c конечный кадр данных

+----------+--------+-------+--------------------+-------+--------------------+
|      date|    time|from_to|      expression_col                                 | category
+----------+--------+-------+--------------------+-------+--------------------+
|2019-11-08|05:55:41|   MO-N|test=LN,x23=test,x5=66,lastkey1=BN zzzTemporary59 0  | category-1
|2019-11-08|05:55:41|   MO-N|test=LN,x23=test,x5=66,lastkey2=BN zzzTemporary59 0  | category-2  
|2019-11-08|05:55:41|   MO-N|test=LN,x23=test,x5=66,lastkey3=BN zzzTemporary59 0  | category-3

Я могу найти нужный результат с помощью регулярного выражения типа

.*,(.*)=.*$

, но как получить то же самое с помощью пользовательской функции

1 Ответ

3 голосов
/ 28 января 2020

Предполагая, что expression_col является обычным String:

scala> val df = Seq((100,"test=LN,x23=test,x5=66,lastkey1=BN zzzTemporary59"), (200,"test=LN,x23=test,x5=66,lastkey2=BN zzzTemporary59"), (300, "test=LN,x23=test,x5=66,lastkey3=BN zzzTemporary59 0")).toDF("id", "expression_col")
df: org.apache.spark.sql.DataFrame = [id: int, expression_col: string]

scala> df.withColumn("category", concat(lit("category-"), regexp_extract(df.col("expression_col"), "lastkey(\\d+)=", 1))).show()
+---+--------------------+----------+
| id|      expression_col|  category|
+---+--------------------+----------+
|100|test=LN,x23=test,...|category-1|
|200|test=LN,x23=test,...|category-2|
|300|test=LN,x23=test,...|category-3|
+---+--------------------+----------+

Используйте регулярное выражение, которое извлекает по меньшей мере 1 di git, т.е. \d+ из строкового ввода, после "lastkey".

Используйте concat, чтобы добавить "category-" в качестве префикса.

Обратите внимание, что df выше является вашей упрощенной версией.

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