Python PySpark DataFrame-筛选器嵌套列
我知道有很多类似的问题,但我还没有发现任何与我的场景完全匹配的问题,所以请不要对重复标志太过兴奋。我在Azure Databricks中使用Spark 3.0.1开发Python3笔记本 我有以下数据帧 可以使用此代码创建 我把它转换成这个数据帧 使用此代码 现在,我试图过滤掉Python PySpark DataFrame-筛选器嵌套列,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我知道有很多类似的问题,但我还没有发现任何与我的场景完全匹配的问题,所以请不要对重复标志太过兴奋。我在Azure Databricks中使用Spark 3.0.1开发Python3笔记本 我有以下数据帧 可以使用此代码创建 我把它转换成这个数据帧 使用此代码 现在,我试图过滤掉名称,其中LastName为空或为空字符串。 我的总体目标是拥有一个可以在json中序列化的对象,其中不包括名称为空的名称值 像这样 我试过了 df2 = df2.filter(lambda x: (len(x)>0
名称
,其中LastName
为空或为空字符串。
我的总体目标是拥有一个可以在json中序列化的对象,其中不包括名称
为空的名称
值
像这样
我试过了
df2 = df2.filter(lambda x: (len(x)>0), F.col('Names')['LastName'])
但是我得到一个错误,“Column”对象是不可调用的
我还尝试了df2=df2.filter(F.col('Names')['LastName'])>0)
,但这给了我一个无效语法的错误
我试过了
df2 = df2.filter(lambda x: (len(x)>0), F.col('Names')['LastName'])
但这会导致错误TypeError:filter()接受2个位置参数,但给出了3个
有人能告诉我如何工作吗?您可以使用高阶函数过滤器
:
import pyspark.sql.functions as F
df3 = df2.withColumn(
'Names',
F.expr("filter(Names, x -> case when x.NameType = 'LastName' and length(x.Name) = 0 then false else true end)")
)
df3.show(truncate=False)
+---+-----------------------------------------+
|ID |Names |
+---+-----------------------------------------+
|1 |[[FirstName, John], [LastName, Doe]] |
|2 |[[FirstName, Michael]] |
|3 |[[FirstName, Angela], [LastName, Merkel]]|
+---+-----------------------------------------+
您可以使用高阶函数过滤器
:
import pyspark.sql.functions as F
df3 = df2.withColumn(
'Names',
F.expr("filter(Names, x -> case when x.NameType = 'LastName' and length(x.Name) = 0 then false else true end)")
)
df3.show(truncate=False)
+---+-----------------------------------------+
|ID |Names |
+---+-----------------------------------------+
|1 |[[FirstName, John], [LastName, Doe]] |
|2 |[[FirstName, Michael]] |
|3 |[[FirstName, Angela], [LastName, Merkel]]|
+---+-----------------------------------------+
[
{
"ID": 1,
"Names": [
{
"NameType": "FirstName",
"Name": "John"
},
{
"NameType": "LastName",
"Name": "Doe"
}
]
},
{
"ID": 2,
"Names": [
{
"NameType": "FirstName",
"Name": "Michael"
}
]
},
{
"ID": 3,
"Names": [
{
"NameType": "FirstName",
"Name": "Angela"
},
{
"NameType": "LastName",
"Name": "Merkel"
}
]
}
]
df2 = df1.select(
'ID',
F.array(
F.struct(
F.lit('FirstName').alias('NameType'),
F.col('FirstName').alias('Name')
),
F.struct(
F.lit('LastName').alias('NameType'),
F.col('LastName').alias('Name')
)
).filter(lambda x: x.col('LastName').isNotNull()).alias('Names')
)
df2 = df2.filter(lambda x: (len(x)>0), F.col('Names')['LastName'])
import pyspark.sql.functions as F
df3 = df2.withColumn(
'Names',
F.expr("filter(Names, x -> case when x.NameType = 'LastName' and length(x.Name) = 0 then false else true end)")
)
df3.show(truncate=False)
+---+-----------------------------------------+
|ID |Names |
+---+-----------------------------------------+
|1 |[[FirstName, John], [LastName, Doe]] |
|2 |[[FirstName, Michael]] |
|3 |[[FirstName, Angela], [LastName, Merkel]]|
+---+-----------------------------------------+