Spark는 열의 배열에서 동일한 값을 가진 모든 행을 가져옵니다.

페데리코 타친

나는 스파크 열 Dataframe이 idhashes열이, hashes포함 Seq길이의 정수 값을 n. 예:

+----+--------------------+
+  id|              hashes|
+----+--------------------+
|0   |     [1, 2, 3, 4, 5]|
|1   |     [1, 5, 3, 7, 9]|
|2   |     [9, 3, 6, 8, 0]|
+-------------------------+

hashes적어도 한 위치에서 배열이 일치 하는 모든 행이있는 데이터 프레임을 얻고 싶습니다 . 더 공식적으로, 나는 추가로 열이있는 dataframe하려는 matches각 행에 대해 것을 r포함 Seqid경우 행들 hashes[r][i] == hashes[k][i]k의 좋은 초원에서 하나 개의 값을 다른 행 인을 i.

내 예제 데이터의 경우 결과는 다음과 같습니다.

+---+---------------+-------+
|id |hashes         |matches|
+---+---------------+-------+
|0  |[1, 2, 3, 4, 5]|[1]    |
|1  |[1, 5, 3, 7, 9]|[0]    |
|2  |[9, 3, 6, 8, 0]|[]     |
+---+---------------+-------+
빈센트 도바

Spark 3에서 다음 코드는 두 배열이 동일한 위치에서 하나 이상의 요소를 공유하는 행만 유지하면서 행 간의 배열을 비교합니다. df입력 데이터 프레임입니다.

    df.join(
      df.withColumnRenamed("id", "id2").withColumnRenamed("hashes", "hashes2"),
      exists(arrays_zip(col("hashes"), col("hashes2")), x => x("hashes") === x("hashes2"))
    )
      .groupBy("id")
      .agg(first(col("hashes")).as("hashes"), collect_list("id2").as("matched"))
      .withColumn("matched", filter(col("matched"), x => x.notEqual(col("id"))))

상세 설명

먼저 두 개의 해시 배열에서 동일한 위치에있는 최소 하나의 요소 조건에 따라 필터링 된 자동 교차 조인을 수행합니다.

조건을 구축하기 위해 첫 번째 데이터 프레임에서 하나씩, 두 번째 결합 된 데이터 프레임에 대해 하나씩, 즉 열 이름이 변경된 첫 번째 데이터 프레임 인 두 개의 해시 배열을 압축합니다. 압축하여 배열을 얻고 {"hashes":x, "hashes2":y}다음으로이 배열에 요소가 존재하는지 확인해야합니다 x = y. 완전한 조건은 다음과 같이 작성됩니다.

exists(arrays_zip(col("hashes"), col("hashes2")), x => x("hashes") === x("hashes2"))

그런 다음 열별로 집계하여 보관 된 id모든 id2행, 즉 조건과 일치하는 행 을 수집합니다.

"해시"열을 유지하기 위해 동일한 "id"를 가진 두 행의 "해시"열이 같으면 각 "id"에 대해 "해시"가 처음으로 나타납니다. 그리고 collect_list를 사용하여 모든 "id2"를 수집합니다 .

.agg(first(col("hashes")).as("hashes"), collect_list("id2").as("matches"))

마지막으로 현재 행의 ID와 "일치하는"열에서 필터링합니다.

.withColumn("matches", filter(col("matches"), x => x.notEqual(col("id"))))

순서대로 "id"가 필요한 경우 orderBy절을 추가 할 수 있습니다 .

.orderBy("id")

운영

df다음 값을 포함 하는 데이터 프레임 사용 :

+---+---------------+
|id |hashes         |
+---+---------------+
|0  |[1, 2, 3, 4, 5]|
|1  |[1, 5, 3, 7, 9]|
|2  |[9, 3, 6, 8, 0]|
+---+---------------+

다음 출력이 표시됩니다.

+---+---------------+-------+
|id |hashes         |matches|
+---+---------------+-------+
|0  |[1, 2, 3, 4, 5]|[1]    |
|1  |[1, 5, 3, 7, 9]|[0]    |
|2  |[9, 3, 6, 8, 0]|[]     |
+---+---------------+-------+

제한

조인은 데카르트 곱으로 매우 비쌉니다. 조건이 결과를 필터링하더라도 큰 데이터 세트에서 엄청난 양의 계산 / 셔플이 발생할 수 있으며 성능이 매우 저하 될 수 있습니다.

3.0 이전 버전의 Spark를 사용하는 경우 일부 내장 Spark 함수사용자 정의 함수 로 대체해야 합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Arraylist는 모든 배열 위치의 모든 행에 대해 동일한 값을 가져옵니다.

분류에서Dev

2 개의 다른 열에서 동일한 값과 일치하는 모든 행을 가져옵니다.

분류에서Dev

Postgres는 하나의 동일한 열 값을 가진 행을 가져옵니다.

분류에서Dev

Redis : 일부 기준과 동일한 값을 가진 모든 키를 대기열에서 가져옵니다.

분류에서Dev

동일한 문자로 시작하는 모든 열의 배열을 가져옵니다.

분류에서Dev

동일한 열 값을 가진 모든 행을 반환하는 SQL 쿼리

분류에서Dev

특정 열에서 동일한 값을 가진 Excel의 모든 행 합계

분류에서Dev

MySql은 id = xxx이고 동일한 ID를 가진 행의 다른 테이블에서 최신 열이 1보다 큰 모든 행을 가져옵니다.

분류에서Dev

두 열에 동일한 값을 가진 행 데이터를 가져옵니다.

분류에서Dev

Firestore는 값 배열의 항목과 일치하는 모든 값을 가져옵니다.

분류에서Dev

목록에 대한 모든 열거 값을 가져옵니다

분류에서Dev

Rails는 배열 열에서 모든 고유 항목을 가져옵니다.

분류에서Dev

SQLite 데이터베이스의 열에서 동일한 최소값을 가진 모든 원시를 가져옵니다.

분류에서Dev

배열에서 동일한 값을 가진 모든 구조체를 제거하는 방법

분류에서Dev

java 메소드에서 배열의 모든 값을 가져옵니다.

분류에서Dev

동일한 값을 가진 모든 열 값이있는 행을 어떻게 선택할 수 있습니까?

분류에서Dev

PHP는 배열의 한 열 값을 가져옵니다.

분류에서Dev

MYSQL에서 동일한 값을 가진 열만 가져옵니다.

분류에서Dev

동일한 값을 가진 모든 행의 모든 기본 키 값을 보유하는 새 열을 작성하려면 어떻게해야합니까?

분류에서Dev

Postgres는 null 값이없는 모든 열을 가져옵니다.

분류에서Dev

특정 열의 모든 행에서 임계 값 이상의 값을 가진 파일을 이동합니다.

분류에서Dev

주어진 요소 수에 대해 배열에서 모든 고유 한 조합을 가져옵니다.

분류에서Dev

배열에 대해 연속 된 동일한 숫자의 모든 블록을 가져옵니다.

분류에서Dev

여러 열에 대해 동일한 값을 가진 MySQL 테이블에서 모든 행을 가져 오는 방법은 무엇입니까?

분류에서Dev

테이블에있는 열의 모든 값을 가져옵니다.

분류에서Dev

각 열에 대한 조건과 함께 동일한 열 값을 가진 모든 행의 합계를 가져 오는 쿼리

분류에서Dev

다른 열 값을 기준으로 동일한 열 값을 가진 모든 행을 반환합니다.

분류에서Dev

특정 값보다 크거나 같은 열 값을 가진 모든 행을 가져옵니다.

분류에서Dev

R의 문자열에서 일치하는 모든 문자 요소의 색인을 가져옵니다.

Related 관련 기사

  1. 1

    Arraylist는 모든 배열 위치의 모든 행에 대해 동일한 값을 가져옵니다.

  2. 2

    2 개의 다른 열에서 동일한 값과 일치하는 모든 행을 가져옵니다.

  3. 3

    Postgres는 하나의 동일한 열 값을 가진 행을 가져옵니다.

  4. 4

    Redis : 일부 기준과 동일한 값을 가진 모든 키를 대기열에서 가져옵니다.

  5. 5

    동일한 문자로 시작하는 모든 열의 배열을 가져옵니다.

  6. 6

    동일한 열 값을 가진 모든 행을 반환하는 SQL 쿼리

  7. 7

    특정 열에서 동일한 값을 가진 Excel의 모든 행 합계

  8. 8

    MySql은 id = xxx이고 동일한 ID를 가진 행의 다른 테이블에서 최신 열이 1보다 큰 모든 행을 가져옵니다.

  9. 9

    두 열에 동일한 값을 가진 행 데이터를 가져옵니다.

  10. 10

    Firestore는 값 배열의 항목과 일치하는 모든 값을 가져옵니다.

  11. 11

    목록에 대한 모든 열거 값을 가져옵니다

  12. 12

    Rails는 배열 열에서 모든 고유 항목을 가져옵니다.

  13. 13

    SQLite 데이터베이스의 열에서 동일한 최소값을 가진 모든 원시를 가져옵니다.

  14. 14

    배열에서 동일한 값을 가진 모든 구조체를 제거하는 방법

  15. 15

    java 메소드에서 배열의 모든 값을 가져옵니다.

  16. 16

    동일한 값을 가진 모든 열 값이있는 행을 어떻게 선택할 수 있습니까?

  17. 17

    PHP는 배열의 한 열 값을 가져옵니다.

  18. 18

    MYSQL에서 동일한 값을 가진 열만 가져옵니다.

  19. 19

    동일한 값을 가진 모든 행의 모든 기본 키 값을 보유하는 새 열을 작성하려면 어떻게해야합니까?

  20. 20

    Postgres는 null 값이없는 모든 열을 가져옵니다.

  21. 21

    특정 열의 모든 행에서 임계 값 이상의 값을 가진 파일을 이동합니다.

  22. 22

    주어진 요소 수에 대해 배열에서 모든 고유 한 조합을 가져옵니다.

  23. 23

    배열에 대해 연속 된 동일한 숫자의 모든 블록을 가져옵니다.

  24. 24

    여러 열에 대해 동일한 값을 가진 MySQL 테이블에서 모든 행을 가져 오는 방법은 무엇입니까?

  25. 25

    테이블에있는 열의 모든 값을 가져옵니다.

  26. 26

    각 열에 대한 조건과 함께 동일한 열 값을 가진 모든 행의 합계를 가져 오는 쿼리

  27. 27

    다른 열 값을 기준으로 동일한 열 값을 가진 모든 행을 반환합니다.

  28. 28

    특정 값보다 크거나 같은 열 값을 가진 모든 행을 가져옵니다.

  29. 29

    R의 문자열에서 일치하는 모든 문자 요소의 색인을 가져옵니다.

뜨겁다태그

보관