Как заменить текст в столбце значением, содержащимся в столбцах, названных в этом тексте

В pyspark я пытаюсь заменить несколько текстовых значений в столбце значением, присутствующим в столбцах, имена которых присутствуют в столбце calc (формула).

Итак, чтобы было понятно, вот пример:

Вход:

|param_1|param_2|calc 
|-------|-------|--------
|Cell 1 |Cell 2 |param_1-param_2
|Cell 3 |Cell 4 |param_2/param_1

Необходим вывод:

|param_1|param_2|calc 
|-------|-------|--------
|Cell 1 |Cell 2 |Cell 1-Cell 2
|Cell 3 |Cell 4 |Cell 4/Cell 3

В столбце calc значением по умолчанию является формула. Это может быть что-то такое же простое, как приведенное выше, или что-то вроде «2*(param_8-param_4)/param_2-(param_3/param_7)». Я ищу что-то, чтобы заменить все param_x значениями в связанных столбцах, касающихся имен.

Я пробовал много вещей, но ничего не работает, и большую часть времени, когда я использую replace или regex_replace со столбцом для значения замены, возникает ошибка, что столбец не повторяется.

Кроме того, столбцы param_1, param_2, ..., param_x генерируются динамически, и значения столбца calc могут быть в некоторых из этих столбцов, но не обязательно во всех.

Не могли бы вы помочь мне по этому вопросу с динамическим решением?

Большое спасибо. С наилучшими пожеланиями

Как насчет того, чтобы взять учебник по concat, concat_ws. Попробуйте использовать их для решения этой проблемы, и если у вас возникнут проблемы, сообщите нам, что это за ошибка? документацию по pyspark можно найти здесь spark.apache.org/docs/latest/api/python/reference/index.html

wwnde 05.01.2023 22:27

Какая связь между моей необходимостью замены переменных в формуле и функциями concat ? И я только что прочитал всю документацию, которую вы предоставили, на случай, если будет указано новое назначение, но нет, они просто объединяют данные.

Cazau 06.01.2023 00:18

Так где же формула? Это было неясно, из того, что вы предоставили, мне кажется, что calc - это объединение param1 и 2

wwnde 06.01.2023 00:23

В столбце calc значением по умолчанию является формула. Это может быть что-то такое же простое, как приведенное выше, или что-то вроде «2*(param_8-param_4)/param_2-(param_3/param_7)». Я ищу что-то, чтобы заменить все param_x значениями в связанных столбцах, касающихся имен.

Cazau 06.01.2023 09:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновление: оказалось, я неправильно понял требование. Это будет работать:

for exp in ["regexp_replace(calc, '"+col+"', "+col+")" for col in df.schema.names]:
   df=df.withColumn("calc", F.expr(exp))

Еще одно обновление: для обработки нулевых значений добавьте объединение:

for exp in ["coalesce(regexp_replace(calc, '"+col+"', "+col+"), calc)" for col in df.schema.names]:
   df=df.withColumn("calc", F.expr(exp))

Ввод, вывод:

------- Некоторое время сохраняем раздел ниже только для справки -------

Вы не можете сделать это напрямую, так как вы не сможете напрямую использовать значение столбца, если вы не соберете объект python (что, очевидно, не рекомендуется).

Это будет работать с тем же:

    df = spark.createDataFrame([["1","2", "param_1 - param_2"],["3","4", "2*param_1 + param_2"]]).toDF("param_1", "param_2", "calc");

    df.show()

    df=df.withColumn("row_num", F.row_number().over(Window.orderBy(F.lit("dummy"))))

    as_dict = {row.asDict()["row_num"]:row.asDict()["calc"] for row in df.select("row_num", "calc").collect()}

    expression = f"""CASE {' '.join([f"WHEN row_num ='{k}' THEN ({v})" for k,v in as_dict.items()])} \
            ELSE NULL END""";

    df.withColumn("Result", F.expr(expression)).show();

Ввод, вывод:

Привет спасибо. Это отлично подходит для следующего шага другого процесса. Он отлично работает с числами, но фактическим шагом здесь является замена метки другой меткой, мой пример вывода действительно то, что мне нужно сейчас. Если у вас есть хитрость, чтобы сделать это :-)

Cazau 06.01.2023 17:09

@Cazau А, хорошо, понял. Только что понял, позвольте мне проверить, я обновлю свой ответ, как только закончу.

Ronak Jain 06.01.2023 17:26

@Cazau Соответствующим образом обновил ответ, дайте мне знать, если вам нужна помощь.

Ronak Jain 06.01.2023 18:10

Большое спасибо @Ronak Jain, оба решения будут использованы для нашего проекта. Это почти нормально, просто небольшое неудобство, если, например, столбец calc = param_1 и столбец param_2 равен нулю, тогда столбец calc также равен нулю.

Cazau 09.01.2023 13:40

@Cazau Это можно исправить с помощью простого колы. дайте мне знать, если вам нужна помощь с тем же. Кроме того, рассмотрите возможность голосования и примите ответ, если он поможет.

Ronak Jain 09.01.2023 14:13

@Cazau Исправлена ​​​​проблема с Null для вас, обновленный ответ :)

Ronak Jain 09.01.2023 14:23

Отлично, большая помощь, спасибо @Ronak Jain!

Cazau 09.01.2023 15:55

Другие вопросы по теме