pySpark 根据列表检查列是否存在

pySpark check if column exists based on list

我的最终目标是如果名称出现在从 df1 提取的值列表中,则比较 df2 中的两个列名称。

我有一个名称列表和一个检查这些名称是否作为列名称存在于 df1 中的函数。但是,这在 python 中有效,但在 pySpark 中无效。我得到的错误:AttributeError: 'DataFrame' object has no attribute 'values'.

如何更改我的函数以便它遍历列名?或者有没有办法将我的列表值与 df2 的列名(完整的数据框;即不需要只用列名创建一个新的数据框)进行比较?

#Function to check matching values 
def checkIfDomainsExists(data, listOfValues):


    '''List of elements  '''
    entityDomainList=Entity.select("DomainName").rdd.flatMap(lambda x:x).collect()
    #entityDomainList

    '''Check if given elements exists in data'''
    results_true = {}
    results_false ={}
    #Iterate over list of domains one by one
    for elem in listOfValues:
        #Check if the element exists in dataframe values
        if elem in data.columns:
            results_true[elem] = True
        else:
            results_false[elem] = False
    #Return dictionary of values and their flag
    #Only return TRUE values 
    return results_true;
# Get TRUE matched column values 
results_true = checkIfDomainsExists(psv, entityDomainList)
results_true

您不需要编写仅用于过滤值的函数。 您可以通过以下方式做到这一点:

df = spark.createDataFrame([(1, 'LeaseStatus'), (2, 'IncludeLeaseInIPM'), (5, 'NonExistantDomain')], ("id", "entity"))
domainList=['LeaseRecoveryType','LeaseStatus','IncludeLeaseInIPM','LeaseAccountType', 'ClassofUse','LeaseType']

df.withColumn('Exists', df.entity.isin(domainList)).filter(f.col('Exists')=='true').show()

+---+-----------------+------+
| id|           entity|Exists|
+---+-----------------+------+
|  1|      LeaseStatus|  true|
|  2|IncludeLeaseInIPM|  true|
+---+-----------------+------+

#or you can filter directly without adding additional column

df.filter(f.col('entity').isin(domainList)).select('entity').collect()

[Row(entity='LeaseStatus'), Row(entity='IncludeLeaseInIPM')]

希望对您有所帮助。