代码之家  ›  专栏  ›  技术社区  ›  user3685285

Spark SQL仅映射DataFrame的一列

  •  4
  • user3685285  · 技术社区  · 7 年前

    很抱歉提出这个问题,我在SparkSQL中有这样一个数据帧:

    id | name | data
    ----------------
    1  | Mary | ABCD
    2  | Joey | DOGE
    3  | Lane | POOP
    4  | Jack | MEGA
    5  | Lynn | ARGH
    

    我想知道如何做两件事:

    1) 在一列或多列上使用scala函数生成另一列 2) 在一列或多列上使用scala函数替换列

    示例:

    1) 创建一个新的布尔列,告知数据是否以以下开头:

    id | name | data | startsWithA
    ------------------------------
    1  | Mary | ABCD |        true
    2  | Joey | DOGE |       false
    3  | Lane | POOP |       false
    4  | Jack | MEGA |       false
    5  | Lynn | ARGH |        true
    

    2) 将数据列替换为小写对应项:

    id | name | data
    ----------------
    1  | Mary | abcd
    2  | Joey | doge
    3  | Lane | poop
    4  | Jack | mega
    5  | Lynn | argh
    

    在SparkSQL中实现这一点的最佳方法是什么?我已经看到了许多如何返回单个转换列的示例,但我不知道如何返回包含所有原始列的新数据帧。

    1 回复  |  直到 7 年前
        1
  •  4
  •   koiralo    7 年前

    您可以使用 withColumn 添加新的 column 或替换现有列 像

    val df = Seq(
     (1, "Mary", "ABCD"),
     (2, "Joey", "DOGE"),
     (3, "Lane", "POOP"),
     (4, "Jack", "MEGA"),
     (5, "Lynn", "ARGH")
    ).toDF("id", "name", "data")
    
    
    val resultDF = df.withColumn("startsWithA", $"data".startsWith("A"))
      .withColumn("data", lower($"data"))
    

    如果需要单独的数据帧

    val resultDF1 = df.withColumn("startsWithA", $"data".startsWith("A"))
    val resultDF2 = df.withColumn("data", lower($"data"))
    

    WITH列 替换旧的 如果相同 提供名称并创建新的 如果是新的 提供名称。 输出:

    +---+----+----+-----------+
    |id |name|data|startsWithA|
    +---+----+----+-----------+
    |1  |Mary|abcd|true       |
    |2  |Joey|doge|false      |
    |3  |Lane|poop|false      |
    |4  |Jack|mega|false      |
    |5  |Lynn|argh|true       |
    +---+----+----+-----------+