Добавить новый столбец с заархивированным списком как постоянное значение в pyspark - PullRequest
1 голос
/ 06 апреля 2020

У меня есть фрейм данных payspark, и я хочу добавить новый столбец с постоянным значением x , который представляет собой сжатый список:

x = [('1', 'hello'),('2', 'Hi'),('3', 'Hello')]

Но когда я запускаю этот код:

df = df.withColumn('case', x)

Я получаю эту ошибку:

AssertionError: col should be Column

Как я могу дать структуру этому списку для обработки этой ошибки, я знаю, что для int или строкового значения мы можем использовать функцию Lit, но для этого формата я не знаю, что делать.

1 Ответ

1 голос
/ 06 апреля 2020

Вы можете поместить string literals в structs в array.

x = [('1', 'hello'),('2','Hi'),('3', 'Hello')]

df.withColumn("col1", F.array(*[F.struct(F.lit(i[0]),F.lit(i[1])) for i in x])).show(truncate=False)

+---------------------------------+
|col1                             |
+---------------------------------+
|[[1, hello], [2, Hi], [3, Hello]]|
|[[1, hello], [2, Hi], [3, Hello]]|
+---------------------------------+

Or, вы создаете array из arrays:

x = [('1', 'hello'),('2','Hi'),('3', 'Hello')]

df.withColumn("col1", F.array(*[F.array(F.lit(i[0]),F.lit(i[1])) for i in x])).show(truncate=False)

+---------------------------------+
|col1                             |
+---------------------------------+
|[[1, hello], [2, Hi], [3, Hello]]|
|[[1, hello], [2, Hi], [3, Hello]]|
+---------------------------------+

Or, вы можете использовать create_map аналогичным образом:

x = [('1', 'hello'),('2','Hi'),('3', 'Hello')]

df.withColumn("col1",F.array(*[F.create_map(F.lit(i[0]),F.lit(i[1])) for i in x])).show(truncate=False)

+---------------------------------------+
|col1                                   |
+---------------------------------------+
|[[1 -> hello], [2 -> Hi], [3 -> Hello]]|
|[[1 -> hello], [2 -> Hi], [3 -> Hello]]|
+---------------------------------------+
...