[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.시험:
시험:
df.withColumn("_tmp", split($"columnToSplit", "\\.")).select( $"_tmp".getItem(0).as("col1"), $"_tmp".getItem(1).as("col2"), $"_tmp".getItem(2).as("col3") ).drop("_tmp")
-
==============================
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.선택 부분을 피하는 솔루션입니다. 그냥 새 열을 추가 할 때 유용합니다 :
선택 부분을 피하는 솔루션입니다. 그냥 새 열을 추가 할 때 유용합니다 :
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.이것은 원래 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.이 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()
from https://stackoverflow.com/questions/39255973/split-1-column-into-3-columns-in-spark-scala by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라 로그인 할 때 어떻게 반환 값을 유지 (0) | 2019.11.01 |
---|---|
[SCALA] 스칼라는 어떻게 목록에 발생 횟수를 셀 수 (0) | 2019.11.01 |
[SCALA] 무엇 setMaster을한다 '지역 [*]`스파크에 의미? (0) | 2019.11.01 |
[SCALA] 스칼라에서 "평가" (0) | 2019.11.01 |
[SCALA] / 이해의 표현을위한 스칼라의 desugared 부분을 얻기? (0) | 2019.11.01 |