복붙노트

[SCALA] 스파크 스칼라 3 열에 1 열 분열

SCALA

스파크 스칼라 3 열에 1 열 분열

나는 스파크 내가 분할 필요가 열이 스칼라를 사용에 dataframe 있습니다.

scala> test.show
+-------------+
|columnToSplit|
+-------------+
|        a.b.c|
|        d.e.f|
+-------------+

나는 다음과 같이 밖으로 분할이 열이 필요합니다 :

+--------------+
|col1|col2|col3|
|   a|   b|   c|
|   d|   e|   f|
+--------------+

나는 스파크 2.0.0를 사용하고 있습니다

감사

해결법

  1. ==============================

    1.시험:

    시험:

    df.withColumn("_tmp", split($"columnToSplit", "\\.")).select(
      $"_tmp".getItem(0).as("col1"),
      $"_tmp".getItem(1).as("col2"),
      $"_tmp".getItem(2).as("col3")
    ).drop("_tmp")
    
  2. ==============================

    2.프로그램이 작업을 수행하려면, 당신은 (0 ~ 3까지) .MAP와 표현의 순서 만들 수 있습니다 (전 => COL ( "임시을").의 getItem (I)이 .as (들 "을 col $의 난을")) (당신이 필요로하는 가정 _ * 구문 : 3 열이 선택 적용 후 결과로서)과 :

    프로그램이 작업을 수행하려면, 당신은 (0 ~ 3까지) .MAP와 표현의 순서 만들 수 있습니다 (전 => COL ( "임시을").의 getItem (I)이 .as (들 "을 col $의 난을")) (당신이 필요로하는 가정 _ * 구문 : 3 열이 선택 적용 후 결과로서)과 :

    df.withColumn("temp", split(col("columnToSplit"), "\\.")).select(
        (0 until 3).map(i => col("temp").getItem(i).as(s"col$i")): _*
    ).show
    +----+----+----+
    |col0|col1|col2|
    +----+----+----+
    |   a|   b|   c|
    |   d|   e|   f|
    +----+----+----+
    

    모든 열을 유지하려면 :

    df.withColumn("temp", split(col("columnToSplit"), "\\.")).select(
        col("*") +: (0 until 3).map(i => col("temp").getItem(i).as(s"col$i")): _*
    ).show
    +-------------+---------+----+----+----+
    |columnToSplit|     temp|col0|col1|col2|
    +-------------+---------+----+----+----+
    |        a.b.c|[a, b, c]|   a|   b|   c|
    |        d.e.f|[d, e, f]|   d|   e|   f|
    +-------------+---------+----+----+----+
    

    당신이 pyspark를 사용하는 경우, 스칼라의지도를 대체 할 지능형리스트를 사용합니다 :

    df = spark.createDataFrame([['a.b.c'], ['d.e.f']], ['columnToSplit'])
    from pyspark.sql.functions import col, split
    
    (df.withColumn('temp', split('columnToSplit', '\\.'))
       .select(*(col('temp').getItem(i).alias(f'col{i}') for i in range(3))
    ).show()
    +----+----+----+
    |col0|col1|col2|
    +----+----+----+
    |   a|   b|   c|
    |   d|   e|   f|
    +----+----+----+
    
  3. ==============================

    3.선택 부분을 피하는 솔루션입니다. 그냥 새 열을 추가 할 때 유용합니다 :

    선택 부분을 피하는 솔루션입니다. 그냥 새 열을 추가 할 때 유용합니다 :

    case class Message(others: String, text: String)
    
    val r1 = Message("foo1", "a.b.c")
    val r2 = Message("foo2", "d.e.f")
    
    val records = Seq(r1, r2)
    val df = spark.createDataFrame(records)
    
    df.withColumn("col1", split(col("text"), "\\.").getItem(0))
      .withColumn("col2", split(col("text"), "\\.").getItem(1))
      .withColumn("col3", split(col("text"), "\\.").getItem(2))
      .show(false)
    
    +------+-----+----+----+----+
    |others|text |col1|col2|col3|
    +------+-----+----+----+----+
    |foo1  |a.b.c|a   |b   |c   |
    |foo2  |d.e.f|d   |e   |f   |
    +------+-----+----+----+----+
    

    업데이트 : 내가보기 엔 세 번 분할 피하기 위해 Psidom의 구현을 사용하는 것이 좋습니다.

  4. ==============================

    4.이것은 원래 DataFrame에 열을 추가 선택 사용하지 않고, 일시적인 열을 사용하여 한 번에 분할 :

    이것은 원래 DataFrame에 열을 추가 선택 사용하지 않고, 일시적인 열을 사용하여 한 번에 분할 :

    import spark.implicits._
    
    df.withColumn("_tmp", split($"columnToSplit", "\\."))
      .withColumn("col1", $"_tmp".getItem(0))
      .withColumn("col2", $"_tmp".getItem(1))
      .withColumn("col3", $"_tmp".getItem(2))
      .drop("_tmp")
    
  5. ==============================

    5.이 Psidom의 답변을 확장하고 열 수를 하드 코딩하지 않고, 동적 분할을 수행하는 방법을 보여줍니다. 이 답변은 열 수를 계산하는 쿼리를 실행합니다.

    이 Psidom의 답변을 확장하고 열 수를 하드 코딩하지 않고, 동적 분할을 수행하는 방법을 보여줍니다. 이 답변은 열 수를 계산하는 쿼리를 실행합니다.

    val df = Seq(
      "a.b.c",
      "d.e.f"
    ).toDF("my_str")
    .withColumn("letters", split(col("my_str"), "\\."))
    
    val numCols = df
      .withColumn("letters_size", size($"letters"))
      .agg(max($"letters_size"))
      .head()
      .getInt(0)
    
    df
      .select(
        (0 until numCols).map(i => $"letters".getItem(i).as(s"col$i")): _*
      )
      .show()
    
  6. from https://stackoverflow.com/questions/39255973/split-1-column-into-3-columns-in-spark-scala by cc-by-sa and MIT license