【问题标题】:Create new DataFrame with new rows depending in number of a column - Spark Scala根据列数创建具有新行的新 DataFrame - Spark Scala
【发布时间】:2017-09-29 01:31:50
【问题描述】:

我有一个包含以下数据的 DataFrame:

  num_cta   | n_lines
110000000000|   2
110100000000|   3
110200000000|   1

有了这些信息,我需要根据 n_lines 列的值创建一个具有不同行数的新 DF。

例如,对于我的 DF 的第一行 (110000000000),n_lines 列的值为 2。结果必须类似于以下内容:

  num_cta   
110000000000
110000000000

对于我展示的所有 Dataframe 示例,获得的结果必须是这样的:

  num_cta  
110000000000
110000000000
110100000000
110100000000
110100000000
110200000000

有没有办法做到这一点?并将一行乘以 n 次,具体取决于列值的值?

问候。

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    一种方法是将n_lines 扩展为具有UDF 和explode 的数组:

    val df = Seq(
      ("110000000000", 2),
      ("110100000000", 3),
      ("110200000000", 1)
    )toDF("num_cta", "n_lines")
    
    def fillArr = udf(
      (n: Int) => Array.fill(n)(1)
    )
    
    val df2 = df.withColumn("arr", fillArr($"n_lines")).
      withColumn("a", explode($"arr")).
      select($"num_cta")
    
    df2.show
    +------------+
    |     num_cta|
    +------------+
    |110000000000|
    |110000000000|
    |110100000000|
    |110100000000|
    |110100000000|
    |110200000000|
    +------------+
    

    【讨论】:

      【解决方案2】:

      没有现成的方法可以做到这一点。但是,您可以尝试遍历数据框并返回 num_cta 列表,其中元素的数量等于相应的 n_lines。

      有点像

       import spark.implicits._
      
       case class (num_cta:String) // output dataframe schema
       case class (num_cta:String, n_lines:Integer) // input dataframe 'df' schema
      
      val result =  df.flatmap(x => {
           List.fill(x.n_lines)(x.num_cta) 
       }).toDF
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-02
        • 2021-09-21
        • 2021-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多