Python 使用PySpark删除spark数据框中嵌套结构中的列(详细信息以文本形式显示)

Python 使用PySpark删除spark数据框中嵌套结构中的列(详细信息以文本形式显示),python,pyspark,apache-spark-sql,nested,drop,Python,Pyspark,Apache Spark Sql,Nested,Drop,我知道我问了一个类似的问题,但那是针对行过滤的。这次我尝试删除列。我试着实现更高阶的函数,比如过滤器和其他一些函数,但没能让它工作。我想我需要的是一个SELECT高阶函数,但它似乎不存在。谢谢你的帮助 我正在使用pyspark,我有一个dataframe对象df,这就是df.printSchema()的输出 root |-- M_MRN: string (nullable = true) |-- measurements: array (nullable = true) | |--

我知道我问了一个类似的问题,但那是针对行过滤的。这次我尝试删除列。我试着实现更高阶的函数,比如
过滤器
和其他一些函数,但没能让它工作。我想我需要的是一个
SELECT
高阶函数,但它似乎不存在。谢谢你的帮助

我正在使用pyspark,我有一个dataframe对象
df
,这就是
df.printSchema()
的输出

root
 |-- M_MRN: string (nullable = true)
 |-- measurements: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- Observation_ID: string (nullable = true)
 |    |    |-- Observation_Name: string (nullable = true)
 |    |    |-- Observation_Result: string (nullable = true)
我只想在“测量”中保留“观察ID”或“观察结果”列。因此,当前当我运行
df时,选择('measurements')。获取(2)

[Row(measurements=[Row(Observation_ID='5', Observation_Name='ABC', Observation_Result='108/72'),
                   Row(Observation_ID='11', Observation_Name='ABC', Observation_Result='70'),
                   Row(Observation_ID='10', Observation_Name='ABC', Observation_Result='73.029'),
                   Row(Observation_ID='14', Observation_Name='XYZ', Observation_Result='23.1')]),
 Row(measurements=[Row(Observation_ID='2', Observation_Name='ZZZ', Observation_Result='3/4'),
                   Row(Observation_ID='5', Observation_Name='ABC', Observation_Result='7')])]
[Row(measurements=[Row(Observation_ID='5', Observation_Result='108/72'),
                   Row(Observation_ID='11', Observation_Result='70'),
                   Row(Observation_ID='10', Observation_Result='73.029'),
                   Row(Observation_ID='14', Observation_Result='23.1')]),
 Row(measurements=[Row(Observation_ID='2', Observation_Result='3/4'),
                   Row(Observation_ID='5', Observation_Result='7')])]
我希望在完成上述过滤后运行
df。选择('measurements')。获取(2)
I get

[Row(measurements=[Row(Observation_ID='5', Observation_Name='ABC', Observation_Result='108/72'),
                   Row(Observation_ID='11', Observation_Name='ABC', Observation_Result='70'),
                   Row(Observation_ID='10', Observation_Name='ABC', Observation_Result='73.029'),
                   Row(Observation_ID='14', Observation_Name='XYZ', Observation_Result='23.1')]),
 Row(measurements=[Row(Observation_ID='2', Observation_Name='ZZZ', Observation_Result='3/4'),
                   Row(Observation_ID='5', Observation_Name='ABC', Observation_Result='7')])]
[Row(measurements=[Row(Observation_ID='5', Observation_Result='108/72'),
                   Row(Observation_ID='11', Observation_Result='70'),
                   Row(Observation_ID='10', Observation_Result='73.029'),
                   Row(Observation_ID='14', Observation_Result='23.1')]),
 Row(measurements=[Row(Observation_ID='2', Observation_Result='3/4'),
                   Row(Observation_ID='5', Observation_Result='7')])]

有没有办法在pyspark中做到这一点?感谢您的帮助

您可以使用
高阶函数
转换
选择所需字段,并将其放入
结构中

from pyspark.sql import functions as F
df.withColumn("measurements",F.expr("""transform(measurements\
,x-> struct(x.Observation_ID as Observation_ID,\
             x.Observation_Result as Observation_Result))""")).printSchema()

#root
 #|-- measurements: array (nullable = true)
 #|    |-- element: struct (containsNull = false)
 #|    |    |-- Observation_ID: string (nullable = true)
 #|    |    |-- Observation_Result: string (nullable = true)