【问题标题】:Adding the row number in spark dataset based on the values of column根据列的值添加火花数据集中的行号
【发布时间】:2019-11-27 06:36:23
【问题描述】:

我有一个示例Dataset<Row> 如下

+----+----+
|col1|col2|
+----+----+
|   a|  a |
|   a|  b |
|   b|  c |
|   c|  d |
+----+----+

基于映射值 Map sample ={"key1" = 2,"key2"=4} 我必须为每一行添加一个 row_number 以便 where col1 or col2 = 'a' 我必须添加 2 个连续的行号和其他作为 4基于来自map 的值,结果应如下所示。 无论col1 or col2 ='a' 行在哪里复制了两次 次,如果不是,它复制了四次 次,后面是数字

+----+----+----------+
|col1|col2|limit_fact|
+----+----+----------+
|   a|  a |         1|
|   a|  a |         2|
|   a|  b |         3|
|   a|  b |         4|
|   b|  c |         5|
|   b|  c |         6|
|   b|  c |         7|
|   b|  c |         8|
|   c|  d |         9|
|   c|  d |        10|
|   c|  d |        11|
|   c|  d |        12|
+----+----+----------+

【问题讨论】:

    标签: java apache-spark row-number apache-spark-dataset


    【解决方案1】:
    scala> import org.apache.spark.sql.expressions.{UserDefinedFunction, Window}
    
    scala> val key1 = 2
    
    scala> val key2 = 4
    
    scala> def repeatudf:UserDefinedFunction = udf((key:Int) => {var out = "1"
         | val rng = 1 to (key-1)
         | for (i <- rng) {out = out + "," + "1"}
         | out
         | })
    
    scala> df.show
    +----+----+
    |col1|col2|
    +----+----+
    |   a|   a|
    |   a|   b|
    |   b|   c|
    |   c|   d|
    +----+----+
    
    
    scala> val df1 =  df.withColumn("map", when(col("col1") === "a" || col("col2") === "a",  repeatudf(lit(key1))).otherwise(repeatudf(lit(key2))))
                        .withColumn("map", explode(split(col("map"), ",")))
                        .drop("map")
    
    scala> df1.show()
    +----+----+
    |col1|col2|
    +----+----+
    |   a|   a|
    |   a|   a|
    |   a|   b|
    |   a|   b|
    |   b|   c|
    |   b|   c|
    |   b|   c|
    |   b|   c|
    |   c|   d|
    |   c|   d|
    |   c|   d|
    |   c|   d|
    +----+----+
    
    scala> val w =  Window.orderBy(col("col1"), col("col2"))
    
    scala> df1.withColumn("limit_fact", row_number.over(w)).show
    +----+----+----------+
    |col1|col2|limit_fact|
    +----+----+----------+
    |   a|   a|         1|
    |   a|   a|         2|
    |   a|   b|         3|
    |   a|   b|         4|
    |   b|   c|         5|
    |   b|   c|         6|
    |   b|   c|         7|
    |   b|   c|         8|
    |   c|   d|         9|
    |   c|   d|        10|
    |   c|   d|        11|
    |   c|   d|        12|
    +----+----+----------+
    

    【讨论】:

    • concat部分动态怎么做?
    • 你有什么逻辑可以决定它应该是 2 次还是 4 次?还是解决了?
    • 作为输入..可以是任何数字
    • @JohnHumanyun 我已经更新了答案,你可以动态传递键值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 2017-12-11
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    相关资源
    最近更新 更多