【问题标题】:Converting row into column using spark scala使用 spark scala 将行转换为列
【发布时间】:2019-02-20 00:42:27
【问题描述】:

我想使用 spark 数据框将行转换为列。

我的桌子是这样的

Eno,Name
1,A
1,B
1,C
2,D
2,E

我想把它转换成

Eno,n1,n2,n3
1,A,B,C
2,D,E,Null

我在下面的代码中使用了这个:-

val r = spark.sqlContext.read.format("csv").option("header","true").option("inferschema","true").load("C:\\Users\\axy\\Desktop\\abc2.csv")

val n =Seq("n1","n2","n3"

 r
    .groupBy("Eno")
    .pivot("Name",n).agg(expr("coalesce(first(Name),3)").cast("double")).show() 

但我得到的结果是-->

+---+----+----+----+
|Eno|  n1|  n2|  n3|
+---+----+----+----+
|  1|null|null|null|
|  2|null|null|null|
+---+----+----+----+

任何人都可以帮助获得期望的结果。

【问题讨论】:

    标签: scala apache-spark hadoop hive bigdata


    【解决方案1】:
    val m= map(lit("A"), lit("n1"), lit("B"),lit("n2"), lit("C"), lit("n3"), lit("D"), lit("n1"), lit("E"), lit("n2"))
    val df= Seq((1,"A"),(1,"B"),(1,"C"),(2,"D"),(2,"E")).toDF("Eno","Name")
    df.withColumn("new", m($"Name")).groupBy("Eno").pivot("new").agg(first("Name"))
    
    
    +---+---+---+----+
    |Eno| n1| n2|  n3|
    +---+---+---+----+
    |  1|  A|  B|   C|
    |  2|  D|  E|null|
    +---+---+---+----+
    

    【讨论】:

    【解决方案2】:
    import org.apache.spark.sql.functions._
    import spark.implicits._
    val df= Seq((1,"A"),(1,"B"),(1,"C"),(2,"D"),(2,"E")).toDF("Eno","Name")
    val getName=udf {(names: Seq[String],i : Int) => if (names.size>i)  names(i) else null}
    
    val tdf=df.groupBy($"Eno").agg(collect_list($"name").as("names"))
    val ndf=(0 to 2).foldLeft(tdf){(ndf,i) => ndf.withColumn(s"n${i}",getName($"names",lit(i))) }.
    drop("names")
    ndf.show()
    +---+---+---+----+
    |Eno| n0| n1|  n2|
    +---+---+---+----+
    |  1|  A|  B|   C|
    |  2|  D|  E|null|
    +---+---+---+----+
    

    【讨论】:

      猜你喜欢
      • 2020-08-11
      • 2020-02-09
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 2017-12-29
      • 2018-03-31
      • 2017-06-11
      相关资源
      最近更新 更多