• spark withColumn的使用(笔记)


     目录

            前言:

             spark withColumn的语法及使用:

            准备源数据演示: 

            完整实例代码:


    前言:

    withColumn():是Apache Spark中用于DataFrame操作的函数之一,它的作用是在DataFrame中添加或替换列,或者对现有列进行转换操作和更新等等

     spark withColumn的语法及使用:

    1. 添加新列(用withColumn为Dataframe)
    2. 改变现有列
    3. 将现有列派生出新列
    4 .更改数据类型(可以在改变该列的同时进行类型转换)
    5 .重命名列名(需要使用DataFrame的withColumnRenamed)
    6. 删除一个列 (使用drop)

    准备源数据进行演示: 

    1. import org.apache.spark.SparkConf
    2. import org.apache.spark.sql.{DataFrame, SparkSession}
    3. import org.apache.spark.sql.functions.{col, lit, rand, round}
    4. object text {
    5. def main(args: Array[String]): Unit = {
    6. //新建spark
    7. val spark = new SparkConf().setMaster("local[*]").setAppName("text")
    8. val sc = SparkSession.builder().config(spark).getOrCreate()
    9. //准备源数据
    10. val tuples = Seq(("小白", 19, "江西"),
    11. ("小红", 20, "安徽"),
    12. ("小兰", 21, "河北"))
    13. val frame = sc.createDataFrame(tuples).toDF("name","age","address")
    14. frame.show()

    输出结果为:

    +------+------+---------+
    |name |age  |address|
    +------+-------+--------+
    |小白  | 19     |   江西|
    |小红  | 20     |   安徽|
    |小兰  | 21     |   河北|
    +-------+-------+-------+ 

    1.添加新列

    1. //语法
    2. withColumn(colName : String, col : Column) : DataFrame

    例子:

    1. //1. 用withColumn为dataframe 添加新列
    2. val seq = Seq("小新", 22, "北京")
    3. val frame1 : DataFrame= frame.withColumn("new",round(rand()*100,1) )
    4. frame1.show() //打印

    输出结果为:

    +------+-----+-------+---------+
    |name|age|address| new|
    +------+------+-------+-------+
    |小白  | 19   |   江西|27.7 |
    |小红  | 20   |   安徽|98.2 |
    |小兰  | 21   |   河北|51.0 |
    +------+------+-------+-------+

    2. 改变现有列
     

    1. //2. 改变现有列
    2. val frame2: DataFrame = frame.withColumn("age", col("age") - 5)
    3. frame2.show() // 打印

     输出结果为:

    +------+------+-------+
    |name|age|address|
    +-------+------+------+
    |小白   | 14|   江西|
    |小红   | 15|   安徽|
    |小兰   | 16|   河北|
    +------+------+-------+

    3.将现有列派生出新列
     

    1. //3.将现有列派生出新列
    2. val frame3 : DataFrame= frame.withColumn("newCol", col("age")*10)
    3. frame3.show()

    输出结果为:

    +------+--------+--------+--------+
    |name|age|address|newCol|
    +-------+-------+--------+--------+
    |小白   | 19    |   江西|   190|
    |小红   | 20    |   安徽|   200|
    |小兰   | 21    |   河北|   210|
    +--------+------+-------+-------+

    4.更改数据类型(可以在改变该列的同时进行类型转换)
     

    1. //4.更改数据类型(可以在改变该列的同时进行类型转换)
    2. val frame4 : DataFrame = frame.withColumn("age", col("age").cast("float"))
    3. frame4.show

     输出结果为:

    +-------+-------+-------+
    |name | age | address|
    +-------+-------+-------+
    |小白   |19.0  |   江西|
    |小红   |20.0  |   安徽|
    |小兰   |21.0  |   河北|
    +-------+-------+-------+

    5.重命名列名(需要使用DataFrame的withColumnRenamed)
     

    1. // 5.重命名列名(需要使用DataFrame的withColumnRenamed)
    2. val frame5: DataFrame = frame.withColumnRenamed("address", "省份")
    3. frame5.show()

    输出结果为:

    +------+------+------+
    |name|age|省份|
    +------+------+----+
    |小白  | 19  |江西|
    |小红  | 20  |安徽|
    |小兰  | 21  |河北|
    +------+-----+------+

    6. 删除一个列 (使用drop)
     

    1. // 6. 删除一个列 (使用drop)
    2. val frame6: DataFrame = frame.drop("age")
    3. frame6.show

    输出结果为:

    |name|address|
    +-------+-------+
    |小白  |   江西|
    |小红  |   安徽|
    |小兰  |   河北|
    +-------+-------+


    完整实例代码:

    1. import org.apache.spark.SparkConf
    2. import org.apache.spark.sql.{DataFrame, SparkSession}
    3. import org.apache.spark.sql.functions.{col, lit, rand, round}
    4. object text {
    5. def main(args: Array[String]): Unit = {
    6. //新建spark
    7. val spark = new SparkConf().setMaster("local[*]").setAppName("text")
    8. val sc = SparkSession.builder().config(spark).getOrCreate()
    9. //准备源数据
    10. val tuples = Seq(("小白", 19, "江西"),
    11. ("小红", 20, "安徽"),
    12. ("小兰", 21, "河北"))
    13. val frame = sc.createDataFrame(tuples).toDF("name","age","address")
    14. frame.show()
    15. //1. 用withColumn为dataframe 添加新列
    16. val seq = Seq("小新", 22, "北京")
    17. val frame1 : DataFrame= frame.withColumn("new",round(rand()*100,1) )
    18. frame1.show()
    19. //2. 改变现有列
    20. val frame2: DataFrame = frame.withColumn("age", col("age") - 5)
    21. frame2.show() // 打印
    22. //3.将现有列派生出新列
    23. var a = "省"
    24. val frame3 : DataFrame= frame.withColumn("newCol", col("age")*10)
    25. frame3.show()
    26. //4.更改数据类型(可以在改变该列的同时进行类型转换)
    27. val frame4 : DataFrame = frame.withColumn("age", col("age").cast("float"))
    28. frame4.show
    29. // 5.重命名列名(需要使用DataFrame的withColumnRenamed)
    30. val frame5: DataFrame = frame.withColumnRenamed("address", "省份")
    31. frame5.show()
    32. // 6. 删除一个列 (使用drop)
    33. val frame6: DataFrame = frame.drop("age")
    34. frame6.show()
    35. }
    36. }

  • 相关阅读:
    Python AI 绘画
    Node.js实现WebSocket
    JDBC封装增删改操作
    相机镜头、焦距与视野
    shell脚本学习积累
    Hexagon_V65_Programmers_Reference_Manual(10)
    汇聚荣拼多多运营策略是怎么样的?
    凉鞋的 Godot 笔记 203. 变量的常用类型
    Python eval 函数动态地计算数学表达式
    不降逼格的情况下降价格!Chromebook Plus让创新延续和计算机重生
  • 原文地址:https://blog.csdn.net/m0_69097184/article/details/132856473