【问题标题】:Mapping a value into a specific column based on annother column基于另一列将值映射到特定列
【发布时间】:2017-03-01 14:48:39
【问题描述】:

我有以下问题:

  • 一个DataFrame 包含col1 和字符串ABC
  • 第二个col2Integer
  • 还有另外三列col3col4col5(这些列也被命名为ABC)。

因此,

 col1 - col2 - A (col3) - B (col4) - C (col5)
|--------------------------------------------
   A      6
   B      5
   C      6

应该得到

 col1 - col2 - A (col3) - B (col4) - C (col5)
|--------------------------------------------
   A      6       6
   B      5                  5
   C      6                              6

现在我想遍历每一行并根据col1 中的条目将col2 中的整数分配给A、B 或C 列。

我如何做到这一点?

df.withColumn() 我不能使用(或者至少我不知道为什么),val df2 = df.map(x => x ) 也是如此。

期待您的帮助,提前致谢!

最好的,肯

【问题讨论】:

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


    【解决方案1】:

    在键和目标列之间创建映射:

    val mapping = Seq(("A", "col3"), ("B", "col4"), ("C", "col5"))
    

    用它来生成列序列:

    import org.apache.spark.sql.functions.when
    
    val exprs = mapping.map { case (key, target) => 
      when($"col1" === key, $"col2").alias(target) }
    

    添加星号并选择:

    val df = Seq(("A", 6), ("B", 5), ("C", 6)).toDF("col1", "col2")
    df.select($"*" +: exprs: _*)
    

    结果是:

    +----+----+----+----+----+
    |col1|col2|col3|col4|col5|
    +----+----+----+----+----+
    |   A|   6|   6|null|null|
    |   B|   5|null|   5|null|
    |   C|   6|null|null|   6|
    +----+----+----+----+----+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多