>

이것의 스칼라 스파크 구현에 관심이있다 split-column-of-list- 여러 열로 동일한 파이어 파크 데이터 프레임

이 데이터 프레임 제공 :

|              X     |            Y|
+--------------------+-------------+
|                rent|[1,2,3......]|
|     is_rent_changed|[4,5,6......]|
|               phone|[7,8,9......]|

폭발 된 값을 가진 새로운 데이터 프레임을 원하고 제공된 col 이름에 매핑하고 싶습니다 :

colNames = ['cat','dog','mouse'....]
|              Column|cat |dog |mouse |.......|
+--------------------+---|---|--------|-------|
|                rent|1  |2  |3       |.......|
|     is_rent_changed|4  |5  |6       |.......|
|               phone|7  |8  |9       |.......|

시도 :

val out = df.select(col("X"),explode($"Y"))

하지만 잘못된 형식이며 내 colNames 목록에 매핑하는 방법을 모르겠습니다 :

X              | Y |
---------------|---|
rent           |1  |
rent           |2  |
rent           |3  |
.              |.  |
.              |.  |
is_rent_changed|4  |
is_rent_changed|5  |

위의 링크에서 파이썬 솔루션은 목록 이해력을 사용하는 것이 었습니다 :

univar_df10.select([univar_df10.Column] + [univar_df10.Quantile[i] for i in range(length)])

그러나 열 이름이 열의 색인 일 경우 제공된 열 이름 목록을 사용하는 방법을 보여주지 않습니다.

  • 답변 # 1

    실제로는 그렇게 복잡하지 않습니다. 어떤 데이터 프레임의 select  기대, 그냥 Column 의 목록입니다  프로그래밍 방식으로 해당 목록을 만들 수 있습니다 :

    val columns = List("cat", "mouse", "dog")
       .zipWithIndex
       .map{ case (header, idx) => $"y"(idx).alias(header) }
    
    

    그럼 우리가 할 일은 select 에서 사용하는 것뿐입니다 :

    val df = List(("rent", Array(1,2,3)), ("is_rent_changed", Array(3,4,5))).toDF("x", "y")
    df.select($"x" :: columns : _*).show()
    
    

    출력 :

    +---------------+---+-----+---+
    |              x|cat|mouse|dog|
    +---------------+---+-----+---+
    |           rent|  1|    2|  3|
    |is_rent_changed|  3|    4|  5|
    +---------------+---+-----+---+
    
    

    물론 인라인 할 수도 있습니다.

  • 답변 # 2

    특정 가정을 기반으로 한 해결책을 생각해 냈습니다.

    1. 각 배열 행에는 동일한 개수의 요소가 있습니다. 2. Array [String]에 열 이름이 있습니다. 3. Array의 값이 열로 분할 될 것으로 예상되는 수를 알고 있습니다.
    var df1 = df
    
    

    여기서 df  입력 DF입니다. 예를 들어 :-

    +---+---------+
    | id|    value|
    +---+---------+
    |  1|[A, B, C]|
    |  2|[D, E, F]|
    +---+---------+
    val columns = Array("cat","dog","sheep")
    
    

    columns  열 이름의 배열입니다.

    for(i<-1 to columns.length)
    df1 = df1.withColumn(columns(i-1),'value.getItem(i-1))
    
    +---+---------+---+---+-----+
    | id|    value|cat|dog|sheep|
    +---+---------+---+---+-----+
    |  1|[A, B, C]|  A|  B|    C|
    |  2|[D, E, F]|  D|  E|    F|
    +---+---------+---+---+-----+
    
    

    원하는 경우 이제 값 열을 삭제할 수 있습니다. 이것이 효과가 있기를 바랍니다!

관련 자료

  • 이전 html - 제출 버튼 클릭 모달 팝업이 디스플레이 중간에 열리면?
  • 다음 bootstrap 4 - 앵귤러 소재 8에서 두 개의 매트 폼 필드를 똑같이 나눕니다