Поиск остальных столбцов в pyspark dataframe для значений в column1 - PullRequest
1 голос
/ 06 марта 2019

Предположим, что существует фрейм данных pyspark в виде:

id  col1  col2 col3 col4
------------------------
as1  4    10    4    6
as2  6    3     6    1
as3  6    0     2    1
as4  8    8     6    1
as5  9    6     6    9

Есть ли способ найти col 2-4 фрейма данных pyspark длязначения в col1 и для возврата (имя строки идентификатора, имя столбца) ?Например:

In col1, 4 is found in (as1, col3)
In col1, 6 is found in (as2,col3),(as1,col4),(as4, col3) (as5,col3)
In col1, 8 is found in (as4,col2)
In col1, 9 is found in (as5,col4)

Подсказка: Предположим, что col1 будет набором {4,6,8,9}, то есть уникальным

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Да, вы можете использовать оператор Spark SQL .isin.

Давайте сначала создадим DataFrame в вашем примере

Часть 1 - Создание DataFrame

cSchema = StructType([StructField("id", IntegerType()),\
StructField("col1", IntegerType()),\
StructField("col2", IntegerType()),\
StructField("col3", IntegerType()),\
StructField("col4", IntegerType())])


test_data = [[1,4,10,4,6],[2,6,3,6,1],[3,6,0,2,1],[4,8,8,6,1],[5,9,6,6,9]]


df = spark.createDataFrame(test_data,schema=cSchema)

df.show()

+---+----+----+----+----+
| id|col1|col2|col3|col4|
+---+----+----+----+----+
|  1|   4|  10|   4|   6|
|  2|   6|   3|   6|   1|
|  3|   6|   0|   2|   1|
|  4|   8|   8|   6|   1|
|  5|   9|   6|   6|   9|
+---+----+----+----+----+

Часть 2 - Функция для поиска совпадающих значений

isin : логическое выражение, которое оценивается как истинное, если значение этого выражения содержится в оцененных значениях аргументов.http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html

def search(col1,col3):
    col1_list = df.select(col1).rdd\
    .map(lambda x: x[0]).collect()
    search_results = df[df[col3].isin(col1_list)]
    return search_results

search_results.show()

+---+----+----+----+----+
| id|col1|col2|col3|col4|
+---+----+----+----+----+
|  1|   4|  10|   4|   6|
|  2|   6|   3|   6|   1|
|  4|   8|   8|   6|   1|
|  5|   9|   6|   6|   9|
+---+----+----+----+----+

Это должно направить вас в правильном направлении.Вы можете выбрать только столбец идентификаторов и т. Д. Или все, что вы пытаетесь вернуть.Функция может быть легко изменена, чтобы искать больше столбцов для поиска.Надеюсь, это поможет!

0 голосов
/ 31 марта 2019
# create structfield using array list
cSchema = StructType([StructField("id", StringType()),
                      StructField("col1", IntegerType()),
                      StructField("col2", IntegerType()),
                      StructField("col3", IntegerType()),
                      StructField("col4", IntegerType())])

test_data = [['as1', 4, 10, 4, 6],
             ['as2', 6, 3, 6, 1],
             ['as3', 6, 0, 2, 1],
             ['as4', 8, 8, 6, 1],
             ['as5', 9, 6, 6, 9]]

# create pyspark dataframe
df = spark.createDataFrame(test_data, schema=cSchema)

df.show()

# obtain the distinct items for col 1
distinct_list = [i.col1 for i in df.select("col1").distinct().collect()]
# rest columns
col_list = ['id', 'col2', 'col3', 'col4']

# implement the search of values in rest columns found in col 1
def search(distinct_list ):
    for i in distinct_list :
        print(str(i) + ' found in: ')

        # for col in df.columns:
        for col in col_list:
            df_search = df.select(*col_list) \
                .filter(df[str(col)] == str(i))

            if (len(df_search.head(1)) > 0):
                df_search.show()


search(distinct_list)

Найти полный пример кода на GITHUB

Output:

+---+----+----+----+----+
| id|col1|col2|col3|col4|
+---+----+----+----+----+
|as1|   4|  10|   4|   6|
|as2|   6|   3|   6|   1|
|as3|   6|   0|   2|   1|
|as4|   8|   8|   6|   1|
|as5|   9|   6|   6|   9|
+---+----+----+----+----+

6 found in: 
+---+----+----+----+
| id|col2|col3|col4|
+---+----+----+----+
|as5|   6|   6|   9|
+---+----+----+----+

+---+----+----+----+
| id|col2|col3|col4|
+---+----+----+----+
|as2|   3|   6|   1|
|as4|   8|   6|   1|
|as5|   6|   6|   9|
+---+----+----+----+

+---+----+----+----+
| id|col2|col3|col4|
+---+----+----+----+
|as1|  10|   4|   6|
+---+----+----+----+

9 found in: 
+---+----+----+----+
| id|col2|col3|col4|
+---+----+----+----+
|as5|   6|   6|   9|
+---+----+----+----+

4 found in: 
+---+----+----+----+
| id|col2|col3|col4|
+---+----+----+----+
|as1|  10|   4|   6|
+---+----+----+----+

8 found in: 
+---+----+----+----+
| id|col2|col3|col4|
+---+----+----+----+
|as4|   8|   6|   1|
+---+----+----+----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...