Apache spark 如何在pyspark中从结构字段中删除NULL?

Apache spark 如何在pyspark中从结构字段中删除NULL?,apache-spark,pyspark,pyspark-sql,databricks,pyspark-dataframes,Apache Spark,Pyspark,Pyspark Sql,Databricks,Pyspark Dataframes,我有一个包含一个struct字段的DataFrame。我想从struct字段中删除空值 temp_df_struct=df.带列(“VIN_COUNTRY_CD”,结构('BXSR_VEHICLE_1_VIN_COUNTRY_CD','BXSR_VEHICLE_2_VIN_COUNTRY_CD','BXSR_VEHICLE_3_VIN_COUNTRY_CD','BXSR_VEHICLE_4_VIN_COUNTRY_CD','BXSR_VEHICLE_5_VIN_COUNTRY_CD')) 在这些

我有一个包含一个struct字段的DataFrame。我想从struct字段中删除空值

temp_df_struct=df.带列(“VIN_COUNTRY_CD”,结构('BXSR_VEHICLE_1_VIN_COUNTRY_CD','BXSR_VEHICLE_2_VIN_COUNTRY_CD','BXSR_VEHICLE_3_VIN_COUNTRY_CD','BXSR_VEHICLE_4_VIN_COUNTRY_CD','BXSR_VEHICLE_5_VIN_COUNTRY_CD'))


在这些不同的列中,有些列包含空值。有什么方法可以从struct字段中删除null吗?

您应该始终提供一个小的可重复的示例-但是我猜您想要什么

示例数据 复制你所拥有的 您希望将多列中的值收集到一个数组中,例如

import re
from pyspark.sql.functions import col, array
collect_cols = [c for c in df.columns if re.match('BXSR_VEHICLE_\\d_VIN_COUNTRY_CD', c)]
collect_cols
# ['BXSR_VEHICLE_1_VIN_COUNTRY_CD', 'BXSR_VEHICLE_2_VIN_COUNTRY_CD', 'BXSR_VEHICLE_3_VIN_COUNTRY_CD', 'BXSR_VEHICLE_4_VIN_COUNTRY_CD', 'BXSR_VEHICLE_5_VIN_COUNTRY_CD']
(
    df.
        withColumn(
            "VIN_COUNTRY_CD",
            array(*collect_cols)
        ).
        select('id', 'VIN_COUNTRY_CD').
        show(truncate=False)
)
# +---+-----------------+
# |id |VIN_COUNTRY_CD   |
# +---+-----------------+
# |1  |[10, 20,, 30, 40]|
# |2  |[, 15, 25, 35,]  |
# +---+-----------------+
解决方案 然后从数组中删除空值

from pyspark.sql.functions import array, struct, lit, array_except
(
    df.
        withColumn(
            "VIN_COUNTRY_CD",
            array(*collect_cols)
        ).
        withColumn(
            'VIN_COUNTRY_CD',
            array_except(
                col('VIN_COUNTRY_CD'),
                array(lit(None).cast('string'))
            )
        ).
        select('id', 'VIN_COUNTRY_CD').
        show(truncate=False)
)
# +---+----------------+                                                          
# |id |VIN_COUNTRY_CD  |
# +---+----------------+
# |1  |[10, 20, 30, 40]|
# |2  |[15, 25, 35]    |
# +---+----------------+

你应该总是提供一个小的可复制的例子——但我猜你想要什么

示例数据 复制你所拥有的 您希望将多列中的值收集到一个数组中,例如

import re
from pyspark.sql.functions import col, array
collect_cols = [c for c in df.columns if re.match('BXSR_VEHICLE_\\d_VIN_COUNTRY_CD', c)]
collect_cols
# ['BXSR_VEHICLE_1_VIN_COUNTRY_CD', 'BXSR_VEHICLE_2_VIN_COUNTRY_CD', 'BXSR_VEHICLE_3_VIN_COUNTRY_CD', 'BXSR_VEHICLE_4_VIN_COUNTRY_CD', 'BXSR_VEHICLE_5_VIN_COUNTRY_CD']
(
    df.
        withColumn(
            "VIN_COUNTRY_CD",
            array(*collect_cols)
        ).
        select('id', 'VIN_COUNTRY_CD').
        show(truncate=False)
)
# +---+-----------------+
# |id |VIN_COUNTRY_CD   |
# +---+-----------------+
# |1  |[10, 20,, 30, 40]|
# |2  |[, 15, 25, 35,]  |
# +---+-----------------+
解决方案 然后从数组中删除空值

from pyspark.sql.functions import array, struct, lit, array_except
(
    df.
        withColumn(
            "VIN_COUNTRY_CD",
            array(*collect_cols)
        ).
        withColumn(
            'VIN_COUNTRY_CD',
            array_except(
                col('VIN_COUNTRY_CD'),
                array(lit(None).cast('string'))
            )
        ).
        select('id', 'VIN_COUNTRY_CD').
        show(truncate=False)
)
# +---+----------------+                                                          
# |id |VIN_COUNTRY_CD  |
# +---+----------------+
# |1  |[10, 20, 30, 40]|
# |2  |[15, 25, 35]    |
# +---+----------------+

您可以创建自己的自定义项来执行此操作,您可以帮助我使用自定义项吗?您可以在此处找到自定义项的类似问题:您可以创建自己的自定义项来执行此操作,您可以帮助我使用自定义项吗?您可以在此处找到自定义项的类似问题: