pySpark проверяет, существует ли столбец на основе списка - PullRequest
0 голосов
/ 29 апреля 2020

Моей конечной целью является сравнение двух имен столбцов в df2, если имена появляются в списке значений, извлеченных из df1.

У меня есть список имен и функция, которая проверяет, существуют ли эти имена как имя столбца в df1. Однако это работает в python и не работает в pySpark. Я получаю сообщение об ошибке: AttributeError: 'DataFrame' object has no attribute 'values'.

Мой процесс выглядит следующим образом:

1) Извлеките значения столбцов из df1 и поместите их в список, таким образом entityDomainList

2) Извлеките столбец names из df2 и превратите его в отдельный фрейм данных (dfNew)

3) создайте функцию, которая проверит, какие значения списка существуют в dfNew

Как я могу изменить свою функцию, чтобы она перебирала имена столбцов? Или есть способ сравнить мои значения списка с именами столбцов df2 (полный кадр данных; ie. Нет необходимости создавать новый кадр данных только с именами столбцов)?

entityDomainList =  ['LeaseRecoveryType','LeaseStatus','IncludeLeaseInIPM','LeaseAccountType', 'ClassofUse','LeaseType']
#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

1 Ответ

0 голосов
/ 30 апреля 2020

Вам не нужно писать функцию для простой фильтрации значений. Вы можете сделать это следующими способами:

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')]

Надеюсь, это поможет.

...