Как проверить, что массив содержит другой массив - PullRequest
0 голосов
/ 22 октября 2019

У меня есть фрейм данных pyspark, который содержит 4 столбца.

Пример фрейма данных:

id                       |  name                          | age |  job
    -------------------------------------------------------------------
     ["98475", "748574"] |  ["98475",748574]              |
    -------------------------------------------------------------------
      ["75473","98456"]  |   ["98456"]                    |
    -------------------------------------------------------------------
      ["23456","28596"]  |   ["84758","56849","86954"]      
    -------------------------------------------------------------------

Я хочу сравнить 2 столбца (array<string> types):

Пример:

Array_A (id)  | Array_B(name)
------------------------------

, если все значения в Array_B совпадают, являются значениями в Array_A ==> ok

, если все значения в Array_B находятся в array_A ==> medium

если значения Array_B не существуют в массиве_A ==> не найден

Я сделал UDF:

def contains(x,y):
        z = len(set(x) - set(y))
        if ((z == 0) & (set(x) == set(y))):
            return "ok"
        elif (set(y).isin(set(x))) & (z != 0):
            return "medium"
        else set(y) != set(x):
            return "not found in raw"


contains_udf = udf(contains)

Затем:

new_df= df.withColumn(
    "new_column",
    F.when(
        (df.id.isNotNull() & df.name.isNotNull()),
        contains_udf(df.id,df.name)
    ).otherwise(
        F.lit(None)
    )

)

Я получил эту ошибку:

else set(y) != set(x):
           ^
SyntaxError: invalid syntax

Как я могу решить ее, используя udf или другое решение, например, array_contains? Спасибо

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Как @ Buckeye14Guy и @Sid указали на основные проблемы в вашем коде, вам также может понадобиться очистить часть логики:

from pyspark.sql.functions import udf

def contains(x,y): 
  try:
    sx, sy = set(x), set(y) 
    if len(sy) == 0: 
        return 'list is empty'
    elif sx == sy: 
        return "ok"    
    elif sy.issubset(sx): 
        return "medium"  
    # below none of sy is in sx
    elif sx - sy == sx: 
        return "none found in raw"  # including empty x
    else: 
        return "some missing in raw"
  # in exception, for example `x` or `y` is None (not a list)
  except:
    return "not an iterable or other errors"

udf_contains = udf(contains, 'string')

df.withColumn('new_column', udf_contains('id', 'name')).show(truncate=False)
+---------------+---------------------+-----------------+
|id             |name                 |new_column       |
+---------------+---------------------+-----------------+
|[98475, 748574]|[98475, 748574]      |ok               |
|[75473, 98456] |[98456]              |medium           |
|[23456, 28596] |[84758, 56849, 86954]|none found in raw|
+---------------+---------------------+-----------------+
0 голосов
/ 22 октября 2019
else set(y) != set(x):
           ^
SyntaxError: invalid syntax

Это потому, что для оператора else не требуется условие. Он содержит код, который должен быть выполнен, только если не выполнено ни одно из предыдущих условий. Используйте вместо:

elif set(y) != set(x):
    #code

ИЛИ

else :
    #code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...