Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySpark DataFrame-筛选器嵌套列_Python_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Python PySpark DataFrame-筛选器嵌套列

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

我知道有很多类似的问题,但我还没有发现任何与我的场景完全匹配的问题,所以请不要对重复标志太过兴奋。我在Azure Databricks中使用Spark 3.0.1开发Python3笔记本

我有以下数据帧

可以使用此代码创建

我把它转换成这个数据帧

使用此代码

现在,我试图过滤掉
名称
,其中
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]]|
+---+-----------------------------------------+