Преобразование с использованием pyspark или sparksql

#azure #dataframe #pyspark #apache-spark-sql

#azure #фрейм данных #pyspark #apache-spark-sql

Вопрос:

Я пытаюсь каким-то образом получить столбец newoutput с помощью логики всякий раз, когда я делю столбец E / C, т.е. 40/5, он дает 8 как разделенный, и мне нужно взять столбец E с цифрой (исключая конечный ноль) * путем деления. т.е. 4,4,4,4,4,4,4.

Пожалуйста, найдите снимок экрана фрейма данных или таблицы. введите описание изображения здесь

Ответ №1:

Вы можете использовать array_repeat и array_join после определения значения для повторения и количества повторений.

Рабочий пример

 from pyspark.sql.functions import array_repeat, array_join, col as c, floor, lit, when
from pyspark.sql import Column

data = [(5, 40, ), (10, 80, ), (20, 120, )]

df = spark.createDataFrame(data, ("C", "E", ))

def repetition(col_c: Column, col_e: Column) -> Column:
    times_to_repeat = floor(c("E") / c("C")).cast("int")
    value_to_repeat = when(c("E") % lit(10) == 0, (c("E") / lit(10)).cast("int")).otherwise(c("E"))
    value_repeat = array_repeat(value_to_repeat, times_to_repeat)
    return array_join(value_repeat, ",")

df.withColumn("Newoutput", repetition(c("C"), c("E"))).show(100, False)
 

Вывод

  --- --- ----------------- 
|C  |E  |Newoutput        |
 --- --- ----------------- 
|5  |40 |4,4,4,4,4,4,4,4  |
|10 |80 |8,8,8,8,8,8,8,8  |
|20 |120|12,12,12,12,12,12|
 --- --- ----------------- 
 

Комментарии:

1. Привет, спасибо, я тоже почти на пути к array_join, который я забыл использовать, теперь он работает нормально.