Divide 1 columna en 3 columnas en spark scala

Tengo un dataframe en Spark usando Scala que tiene una columna que necesito dividir.

scala> test.show +-------------+ |columnToSplit| +-------------+ | abc| | def| +-------------+ 

Necesito que esta columna se divida para que se vea así:

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

Estoy usando Spark 2.0.0

Gracias

Tratar:

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

Una solución que evita la parte seleccionada. Esto es útil cuando solo desea agregar las nuevas columnas:

 case class Message(others: String, text: String) val r1 = Message("foo1", "abc") val r2 = Message("foo2", "def") 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 |abc|a |b |c | |foo2 |def|d |e |f | +------+-----+----+----+----+ 

Para hacer esto programáticamente, puede crear una secuencia de expresiones con (0 until 3).map(i => col("temp").getItem(i).as(s"col$i")) (suponga que necesita 3 columnas como resultado) y luego aplicarlo para select con : _* syntax:

 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| +----+----+----+ 

Para mantener todas las columnas:

 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| +-------------+---------+----+----+----+ | abc|[a, b, c]| a| b| c| | def|[d, e, f]| d| e| f| +-------------+---------+----+----+----+ 

Esto agrega columnas al DataFrame original y no usa select , y solo se divide una vez usando una columna temporal:

 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")