Ответ Танджина должен работать, хотя я хотел бы предложить другой подход.Вместо того, чтобы узнать, сколько столбцов вы должны добавить в свою схему, чтобы создать столбец типа массив / список.Следующий код преобразует ваши данные в rdd, который вместо кортежей содержит строки [key, value], где value - это список типа double.Затем вы можете легко применить приведенную ниже схему.
def test():
l = [('a', 0.0),
('b', 6),
('c', 44),
('d', 107),
('e', 0),
('f', 3),
('g', 4),
('h', 0.025599999353289604),
('i', 0.03239999711513519),
('j', -0.03205680847167969),
('k',0.10429033637046814),
('l',(34.190006256103516, 31.09000015258789, 31.099994659423828)),
('m',(-9.32000732421875, -9.32000732421875, -11.610000610351562))]
# this schema should work for all your cases
schema = StructType([
StructField("id", StringType(), False),
StructField("num_list", ArrayType(DoubleType(), True), True)
])
rdd = spark.sparkContext.parallelize(l).map(lambda r: (r[0], to_float_list(r[1])))
df = spark.createDataFrame(rdd, schema)
df.show(100, False)
def to_float_list(value):
if type(value) is tuple:
return list(map(float, value))
return [float(value)]
Обратите внимание, что функция to_float_list принимает либо кортеж, либо число и преобразует его в список типа double.Это выведет:
+---+-----------------------------------------------------------+
|id |num_list |
+---+-----------------------------------------------------------+
|a |[0.0] |
|b |[6.0] |
|c |[44.0] |
|d |[107.0] |
|e |[0.0] |
|f |[3.0] |
|g |[4.0] |
|h |[0.025599999353289604] |
|i |[0.03239999711513519] |
|j |[-0.03205680847167969] |
|k |[0.10429033637046814] |
|l |[34.190006256103516, 31.09000015258789, 31.099994659423828]|
|m |[-9.32000732421875, -9.32000732421875, -11.610000610351562]|
+---+-----------------------------------------------------------+