Как создать столбец как массив из других столбцов (застрял с несовместимыми типами)? - PullRequest
0 голосов
/ 14 декабря 2018

Скажем, у меня есть некоторые данные подписки, которые выглядят следующим образом:

user_id      subscription_id       expires_at
0238423            113              12/1/18
0238423            938              11/1/18
0238423            901              10/1/18

Теперь я хочу создать новый столбец, который будет вызываться из столбцов subscription_id и expires_at:

user_id          subscription_id    expires_at         Array_Col
0238423            113              12/1/18          [113, 12/1/18]
0238423            938              11/1/18          [938, 11/1/18]
0238423            901              10/1/18          [901, 10/1/18]

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

Вот мой код:

def create_struct(subscription_id, expires_at):
    x = [subscription_id, expires_at]
    return x  

create_struct = udf(create_struct, ArrayType(StructType([
    StructField("sub_id", StringType(), False),
    StructField("expiration", TimestampType(), True)])))

df = df.withColumn('expiration_dict', create_struct(df.subscription_id, df.expires_at))

Ответы [ 2 ]

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

В качестве альтернативы, если вам нужен массив столбцов, используйте array () из spark.sql.functions

df.withColumn("Array_Col", array($"subscription_id", $"expires_at"))
0 голосов
/ 14 декабря 2018

Я думаю, вам нужен столбец типа структуры вместо типа массива.Не стоит помещать в массив два столбца разных типов.Чтобы создать столбец типа структуры, просто вызовите функцию struct:

from pyspark.sql.functions import struct
df.withColumn('Struct_Col', struct(df.subscription_id, df.expires_at)).show()

#+-------+---------------+----------+--------------+
#|user_id|subscription_id|expires_at|    Struct_Col|
#+-------+---------------+----------+--------------+
#| 238423|            113|   12/1/18|[113, 12/1/18]|
#| 238423|            938|   11/1/18|[938, 11/1/18]|
#| 238423|            901|   10/1/18|[901, 10/1/18]|
#+-------+---------------+----------+--------------+
...