У меня есть решение, которое будет работать. Но может быть медленным для больших данных из-за UDF. Также последний столбец будет строкой, поскольку в нем есть строковый вертикальный символ '|'.
from pyspark.sql.functions import *
from pyspark.sql.types import *
values = [(1,[10,20], [150,160]),
(2,[2], [2|1] ),
(3,[], [])]
rdd = sc.parallelize(values)
schema = StructType([StructField("id", IntegerType(), True),
StructField("size", ArrayType(IntegerType()), True),
StructField("variantID", ArrayType(IntegerType()), True)])
data = spark.createDataFrame(rdd, schema)
data.show()
"""
+---+--------+----------+
| id| size| variantID|
+---+--------+----------+
| 1|[10, 20]|[150, 160]|
| 2| [2]| [3]|
| 3| []| []|
+---+--------+----------+
"""
def arrangeAsReuired(inputString) :
inputString = inputString.replace("[","").replace("]","")
if inputString.strip() in "[]&[]" :
sizeMapPopulated = "[]"
else :
firstArray = inputString.split("&")[0].split(",")
secondArray = inputString.split("&")[1].split(",")
sizeMapPopulated = [str(firstArray[x]) + "|" + str(secondArray[x]) for x in range(0, len(firstArray), 1)]
return str(sizeMapPopulated)
udfToReturnData = udf(lambda z: arrangeAsReuired(z), StringType())
spark.udf.register("udfToReturnData", udfToReturnData)
data = data.withColumn("sizeMap", \
udfToReturnData(concat(col("size").cast("string"), lit("&"), col("variantID").cast("string")).cast("string"))) \
.select("id","size","sizeMap")
data.show(20,False)
"""
+---+--------+----------------------+
|id |size |sizeMap |
+---+--------+----------------------+
|1 |[10, 20]|['10|150', ' 20| 160']|
|2 |[2] |['2|3'] |
|3 |[] |[] |
+---+--------+----------------------+
"""