Подобный кортежу тип данных в pyspark dataframe

#python #pyspark

#python #pyspark

Вопрос:

Предыстория

У меня есть следующий pyspark dataframe

  ----- ----- 
|key_1|key_2|
 ----- ----- 
|True |True |
|False|True |
|False|False|
 ----- ----- 

  

Моя цель

И я хотел бы создать еще один столбец на основе значения в столбцах key_1 и key_2, как показано ниже.

  ----- ----- -------- 
|key_1|key_2|combined|
 ----- ----- -------- 
|True |True |  (1,2) |
|False|True |  (2,)  |
|False|False|  ()    |
 ----- ----- -------- 

  

Моя попытка и вопрос

Я попытался перебрать столбцы

 combined = []
for row in df.rdd.collections():
    tmp = []
    if row[0] is True:
        tmp.append(1)
    if row[1] is True:
        tmp.append(2)
    combined.append(tuple(tmp))
  

Тогда у меня есть список combined = [(1,2),(2,),()]

Как я могу вставить этот combined список, чтобы создать новый столбец в том же pyspark dataframe?

Ответ №1:

пример данных

 sdf1 = sc.parallelize([[True, True],[False, True],[False, False]]).toDF(["key_1", "key_2"])
sdf1.show()
 ----- ----- 
|key_1|key_2|
 ----- ----- 
| true| true|
|false| true|
|false|false|
 ----- ----- 
  

udf

 schema = StructType([
    StructField("value_1", IntegerType()),
    StructField("value_2", IntegerType())
])

def get_tuple(key_1, key_2):
    if key_1:
        value_1 = 1
    else:
        value_1 = None
    if key_2:
        value_2 = 2
    else:
        value_2 = None
    return (value_1, value_2)

get_tuple_udf = udf(get_tuple, schema)
  

Результат

 sdf1.withColumn("value", get_tuple_udf(sf.col("key_1"), sf.col("key_2"))).show()
 ----- ----- ------ 
|key_1|key_2| value|
 ----- ----- ------ 
| true| true|[1, 2]|
|false| true| [, 2]|
|false|false|   [,]|
 ----- ----- ------ 
  

Ответ №2:

Более простое решение:

 import pyspark.sql.functions as F

df = sc.parallelize([[True, True],
                       [False, True],
                       [False, False]]
                     ).toDF(["key_1", "key_2"])

df = df.withColumn("value", F.array(F.when(F.col("key_1"), 1), F.when(F.col("key_2"), 2)))

>>> df.show()
 ----- ----- ------ 
|key_1|key_2| value|
 ----- ----- ------ 
| true| true|[1, 2]|
|false| true| [, 2]|
|false|false|   [,]|
 ----- ----- ------