PySpark list () в withColumn () работает только один раз, тогда AssertionError: col должен быть Column - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть DataFrame с 6 строковыми столбцами, названными как 'Spclty1' ... 'Spclty6' и еще 6 названными как 'StartDt1' ... 'StartDt6'.Я хочу сжать их и свернуть в столбцы, которые выглядят так: [[Spclty1, StartDt1]...[Spclty6, StartDt6]]

Сначала я попытался свернуть только столбцы 'Spclty' в список, подобный этому:

DF = DF.withColumn('Spclty', list(DF.select('Spclty1', 'Spclty2', 'Spclty3', 'Spclty4', 'Spclty5', 'Spclty6')))

Thisсработал в первый раз, когда я его выполнил, дав мне новый столбец под названием «Spclty», содержащий строки, такие как ['014', '124', '547', '000', '000', '000'], как и ожидалось.

Затем я добавил строку в свой скрипт, чтобы сделать то же самое надругой набор из 6 строковых столбцов с именем 'StartDt1' ... 'StartDt6':

DF = DF.withColumn('StartDt', list(DF.select('StartDt1', 'StartDt2', 'StartDt3', 'StartDt4', 'StartDt5', 'StartDt6'))))

Это вызвало AssertionError: col should be Column.

После того, как у меня закончились попытки, я снова попробовал исходную операцию (в качестве проверки работоспособности):

DF.withColumn('Spclty', list(DF.select('Spclty1', 'Spclty2', 'Spclty3', 'Spclty4', 'Spclty5', 'Spclty6'))).collect()

и получил ошибку подтверждения, как указано выше.

Итак, было бы хорошо понять, почему это сработало только в первый раз (только), но главный вопрос: как правильно заархивировать столбцы в коллекцию dict-подобных элементов в Spark?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Спасибо.Прочитав несколько сообщений SO, я выяснил синтаксис для передачи набора столбцов параметру col, используя struct для создания выходного столбца, который содержит список значений:

DF_tmp = DF_tmp.withColumn('specialties', array([
        struct(
         *(col("Spclty{}".format(i)).alias("spclty_code"),
         col("StartDt{}".format(i)).alias("start_date")) 
        )
        for i in range(1, 7)
      ]
))

Итак, конструкции col() и *col() - это то, что я искал, а подход array([struct(...)]) позволяет мне объединять записи Spclty и StartDt в список элементов, похожих на dict.

0 голосов
/ 03 декабря 2018

.withColumn() ожидает объект столбца в качестве второго параметра, и вы предоставляете список.

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