Предполагая, что ваш столбец является структурным типом, а не просто строкой данных JSON:
Есть несколько вариантов.Вы можете использовать «field. *» В SQL, чтобы выбрать все подполя.Самый простой способ сделать это в python - это метод selectExpr
в DataFrame.Обратите внимание, что вы также можете выбрать другие поля, если хотите сохранить их.Например:
>>> data = [
((1, 2, 3, 4),),
((4, 5, 6, 7),)
]
>>> df = spark.createDataFrame(sc.parallelize(data))
>>> df.printSchema()
root
|-- _1: struct (nullable = true)
| |-- _1: long (nullable = true)
| |-- _2: long (nullable = true)
| |-- _3: long (nullable = true)
| |-- _4: long (nullable = true)
>>> df.show()
+------------+
| _1|
+------------+
|[1, 2, 3, 4]|
|[4, 5, 6, 7]|
+------------+
>>> df2 = df.selectExpr("_1 as original", "_1.*")
>>> df2.show()
+------------+---+---+---+---+
| original| _1| _2| _3| _4|
+------------+---+---+---+---+
|[1, 2, 3, 4]| 1| 2| 3| 4|
|[4, 5, 6, 7]| 4| 5| 6| 7|
+------------+---+---+---+---+
В качестве альтернативы, поле схемы в DataFrame может использоваться для определения всех полей и их типов, а также любых подполей.Затем вы можете использовать эти имена, чтобы зациклить их и использовать withColumn
, как вы делали выше.Например:
>>> struct_field = next(f for f in df.schema if f.name == "_1")
>>> subfield_names = [f.name for f in struct_field.dataType.fields]
>>> print subfield_names
['_1', '_2', '_3', '_4']