2017-06-25 5 views
1

これはDFです:2つの異なる列に列を分割する方法は?

org.apache.spark.sql.DataFrame = [year_artist: string, count: bigint] 

df.show()を返します。

+--------------------+-----+ 
|   year_artist|count| 
+--------------------+-----+ 
| 1945_Dick Haymes| 5| 
|1949_Ivory Joe Hu...| 1| 
|  1955_Tex Ritter| 1| 

は、私は2つの別々に最初の列を分割する必要があります年、アーティスト 私はこのSpark map dataframe using the dataframe's schemaのようなものを考えています、しかし、私の実現には、次のことは動作しません

df.rdd.map(row => (row(0).getAs[String].split("_")(0), row(0).getAs[String].split("_")(1))) 

RDDに変換せずにそれを作る方法がありますか?

答えて

2

あなたはregexp_extractを使用する例を形成することができます

import org.apache.spark.sql.functions.regexp_extract 

df.select(
    regexp_extract($"year_artist", "^(\\d{4})_(.*)", 1).alias("year"), 
    regexp_extract($"year_artist", "^(\\d{4})_(.*)", 2).alias("artist") 
) 

またはsplit

import org.apache.spark.sql.functions.split 

df.select(
    split($"year_artist", "_")(0).alias("year"), 
    split($"year_artist", "_")(1).alias("artist") 
) 
0

あなたはsplitを使用してそれを行うことができます(つまり、他の回答にかなり似ています)。

val solution = artists. 
    withColumn("nested", split($"year_artist", "_")). 
    select($"nested"(0) as "year", $"nested"(1) as "artist") 
scala> solution.show 
+----+---------------+ 
|year|   artist| 
+----+---------------+ 
|1945| Dick Haymes| 
|1949|Ivory Joe Hu...| 
|1955|  Tex Ritter| 
+----+---------------+ 

mapと同様の操作が可能です。

val solution = artists. 
    select("year_artist"). // assume you want only one column to work with 
    as[String].    // personally I don't like Rows so make them Strings 
    map { year_artist => year_artist.split("_") }.  // do the hard work using Scala 
    map { case Array(year, artist) => (year, artist) }. // assume there are only two fields 
    toDF("year", "artist") 
scala> solution.show 
+----+---------------+ 
|year|   artist| 
+----+---------------+ 
|1945| Dick Haymes| 
|1949|Ivory Joe Hu...| 
|1955|  Tex Ritter| 
+----+---------------+ 
関連する問題