python - 删除 pyspark 中的嵌套列
问题描述
我有一个带有列结果的 pyspark 数据框。在结果列中,我想删除“属性”列。数据框的架构是:(结果中有更多列,但为方便起见,我没有显示它们,因为架构很大)
|-- results: struct (nullable = true)
| |-- l: array (nullable = true)
| | |-- element: struct (containsNull = true)
| | | |-- m: struct (nullable = true)
| | | | |-- Attributes: struct (nullable = true)
| | | | | |-- m: struct (nullable = true)
| | | | | | |-- Score: struct (nullable = true)
| | | | | | | |-- n: string (nullable = true)
| | | | |-- OtherInfo: struct (nullable = true)
| | | | | |-- l: array (nullable = true)
| | | | | | |-- element: struct (containsNull = true)
| | | | | | | |-- m: struct (nullable = true)
| | | | | | | | |-- Name: string (nullable = true)
如何在 pyspark 中没有 udf 的情况下执行此操作?
编辑:
一行是:
{
"results" : {
"l" : [
{
"m":{
"Attributes" : {
"m" : {
"Score" : {"n" : "85"}
}
},
"OtherInfo":{
"l" : [
{
"m" : {
"Name" : {"john"}
}
},
{
"m" : {
"Name" : "Cena"}
}
]
}
}
}
]
}
}
解决方案
要从结构类型中删除字段,您必须创建一个包含所有元素的新结构,但要从原始结构中删除的元素除外。
l
在这里,由于下面的字段results
是一个数组,您可以使用transform
函数(Spark 2.4+)来更新它的所有结构元素,如下所示:
from pyspark.sql.functions import struct, expr
t_expr = "transform(results.l, x -> struct(struct(x.m.OtherInfo as OtherInfo) as m))"
df = df.withColumn("results", struct(expr(t_expr).alias("l")))
对于数组中的每个元素x
,我们创建仅包含x.m.OtherInfo
字段的新结构。
df.printSchema()
#root
# |-- results: struct (nullable = false)
# | |-- l: array (nullable = true)
# | | |-- element: struct (containsNull = false)
# | | | |-- m: struct (nullable = false)
# | | | | |-- OtherInfo: struct (nullable = true)
# | | | | | |-- l: array (nullable = true)
# | | | | | | |-- element: struct (containsNull = true)
# | | | | | | | |-- m: struct (nullable = true)
# | | | | | | | | |-- Name: string (nullable = true)
推荐阅读
- animation - 当我使用带有 blit = True 的 matplotlib 动画函数时,如何保留最后一帧
- javascript - 如何制作一个通用的正则表达式来验证通过 JS 输入的 UTF-8 特殊字符?
- macos - gmp error: cannot determine how to define a 32-bit word
- javascript - 检查复选框的状态
- c - What would happen if I call getpeername() and getsockname() on server socket at different positions?
- ios - SpriteKit 场景变得无响应
- java - 对于某些文件,加载文件图标有时很慢
- android - 如何在没有 READ_CONTACTS 权限的情况下获取 Android 联系人详细信息
- node.js - req.user 认证后返回 undefined
- json - 访问 JSON 中的自定义密钥