Как умножить все столбцы информационного кадра в pySpark на другой отдельный столбец - PullRequest
3 голосов
/ 30 апреля 2020

У меня есть данные обо всех месяцах с января по де c для населения за определенный год, и у меня есть один столбец с именем "Константа", и мне нужно умножить это постоянное значение столбца на все данные столбцов с января по де c в искре. Например, у меня есть следующие данные:

        JAN FEB MAR...DEC Constant
City1   160 158 253   391   12
City2   212 27  362   512   34
City3   90  150 145   274   56

После умножения я хочу новый / заменить фрейм данных со значениями:

        JAN     FEB MAR ....DEC
City1   192    1896 3036    1656
City2   7208   918  12308   8092
City3   504    280  8120    2464

Я могу сделать это по одному столбцу за раз с кодом:

Df.select("JAN","CONSTANT").withColumn("JAN",col('JAN') * col ('CONSTANT')).show()

Есть ли какая-либо функция / l oop, где я могу получить полное умножение столбца и новые значения данных в течение всех месяцев?

1 Ответ

2 голосов
/ 30 апреля 2020

Вы можете express свои логики c, используя struct из structs. Структуры в основном такие же, как column in higher order, поэтому мы можем присвоить them a name, multiply them by constant, а затем выбрать их, используя columnname.*. Таким образом, вам не нужно делать withColumn 12 times. Вы можете поместить все свои месяцы в listofmonths.

df.show() #sampledata
#+-----+---+---+---+---+--------+
#| City|JAN|FEB|MAR|DEC|Constant|
#+-----+---+---+---+---+--------+
#|City1|160|158|253|391|      12|
#|City2|212| 27|362|512|      34|
#|City3| 90|150|145|274|      56|
#+-----+---+---+---+---+--------+



listofmonths=['JAN','FEB','MAR','DEC']

from pyspark.sql import functions as F
df.withColumn("arr", F.struct(*[(F.col(x)*F.col('Constant')).alias(x) for x in listofmonths]))\
  .select("City","arr.*")\
  .show()

#+-----+----+----+-----+-----+
#| City| JAN| FEB|  MAR|  DEC|
#+-----+----+----+-----+-----+
#|City1|1920|1896| 3036| 4692|
#|City2|7208| 918|12308|17408|
#|City3|5040|8400| 8120|15344|
#+-----+----+----+-----+-----+

Вы также можете просто использовать df.columns вместо listofmonths вот так:

from pyspark.sql import functions as F
df.withColumn("arr", F.struct(*[(F.col(x)*F.col('Constant')).alias(x) for x in df.columns if x!='City' and x!='Constant']))\
  .select("City","arr.*")\
  .show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...