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')]
希望对您有所帮助。
我的最终目标是如果名称出现在从 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')]
希望对您有所帮助。