Spark SQL Dataset 常用API 一

Transformation
Untyped API

首先啰嗦一句,Spark SQL Dataset中主要分为Transformation和Action两种API(这个特性沿用了Spark RDD的特性,其中的Transformation也有懒计算的猥琐特性)

下面主要通过对比SQL语句的方式来记录下如何从一个DataFrame中获取某个字段

首先有个DataFrame,如下

personDf.show()

    1

|age| name| sex|
±–±----±-----+
| 32| Brad| male|
| 31| Anne|female|
| 4|Eason| male|
我们知道,如果是通过SQL语句(把上面的personDf比喻成一个表)选择其中的name列,只要简单的

SELECT name FROM personDf

    1

即可
而在DataFrame中,同样有select这样的API,要完成上面的name这一列的展示也只是

personDf.select("name").show()

    1

一行代码即可,感觉比SQL更简单了,有木有?

那么如何查看一个表的所有的列信息呢,有如下几种方法

    personDf.printSchema
    结果如下:
    root
    |-- age: long (nullable = true)
    |-- name: string (nullable = true)
    |-- sex: string (nullable = true)

上述展示结果比较好看,有点类似于SQL中的
desc personDf;

2.PersonDf.columns
结果如下:
Array[String] = Array(age, name, sex)
此时看不到列的属性

3.personDf.schema
结果如下:
org.apache.spark.sql.types.StructType = StructType(StructField(age,LongType,true), StructField(name,StringType,true), StructField(sex,StringType,true))
这个结果虽然也能看到列的属性,但是不大好看

下面讲述一下和select这个API相关的一些操作
首先,上述的select(“name”)在底层会将字符串“name”转换为Column类,而select实际上是接收Column类,如下操作等同之前的personDf.select(“name”).show()

val nameColumn = personDf.col("name")

    1

单独构建一个Column类,返回结果如下:

org.apache.spark.sql.Column = name

    1

然后再select

personDf.select(nameColumn).show()

    1

而构建Column类有很多种方法,比如

val nameColumn = personDf("name")
val nameColumn = personDf.apply("name")
val nameColumn = personDf.col("name")
val nameColumn = personDf.column("name")

    1
    2
    3
    4

上述四种方法等同

select除了接收Column类型外,还接收ColumnName类型,可以首先将spark的隐式转换导入,

import spark.implicits._

    1

然后使用$符合加""定义一个ColumnName类型,比如

   $"name"

    1

返回的就是

org.apache.spark.sql.ColumnName = name

    1

其次,在SQL操作中,可以重命名以及选择常量或者计算某一列的表达式,还是以上述personDf为例,SQL执行如下操作

SELECT age + 10 as new_age
,"constant" as cons
FROM personDf

    1
    2
    3

上述涉及到

    年龄这一列的计算
    计算后重命名
    定义常量constant
    常量重命名

使用dataset来操作则是

personDf.select(expr("age + 10"),lit("constant")).toDF("new_age","cons").show()

    1

其中expr是用来计算列,里面可以使用列名称加运算符
,lit()是定义常量,后面的toDF可以重命名。
注意,上面的expr只接受String类型,如果把之前定义的Column或者ColumnName类型的变量传入则会报错,

personDf.select(expr(ageCol)).show
<console>:36: error: type mismatch;
 found   : org.apache.spark.sql.ColumnName
 required: String
       personDf.select(expr(ageCol)).show

    1
    2
    3
    4
    5

给DF增加新的一列或者重命名可以使用如下命令,

personDf.withColumn("new_age_column",$"age" + 18).withColumnRenamed("age","old_age").show()
+-------+-----+------+--------------+
|old_age| name|   sex|new_age_column|
+-------+-----+------+--------------+
|     32| Brad|  male|            50|
|     31| Anne|female|            49|
|      4|Eason|  male|            22|
+-------+-----+------+--------------+

    1
    2
    3
    4
    5
    6
    7
    8

其中withColumn是在原有DF的基础上新增加一列new_age_column,而withColumnRenamed是将原有的age列重命名为old_age
————————————————
版权声明:本文为优快云博主「Brad_Q1」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/Brad_Q1/article/details/87513311

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值