基于spark的Scala编程—DataFrame操作之select

本文主要是写关于Scala如何操作spark的DataFrame,本文先介绍select的用法,详细请看下面的步骤,以下所有的代码都是在IntelliJ Idea里面编写并且远程调试的。

先创建sparksession对象,代码如下:

    val conf = new SparkConf().setAppName("LzSparkDatasetExamples").setMaster("local")
    val sparkSession = SparkSession.builder().enableHiveSupport().config(conf).getOrCreate()

创建一个DataFrame对象,代码如下:

    // 这里一定要加这一行导入,否则toDF会报错
    import sparkSession.implicits._
    val df = sparkSession.createDataset(Seq(
      ("aaa", 1, 2),
      ("bbb", 3, 4),
      ("ccc", 3, 5),
      ("bbb", 4, 6)
    )).toDF("key1", "key2", "key3")

这里切记Spark的Scala开发一定要加入以下这一行:

    import sparkSession.implicits._

官方对于SparkSession.implicits的解释是:

public class SparkSession.implicits$ 
extends SQLImplicits implements scala.Serializable

它主要是使RDD转化为DataFrame以及支持后续SQL操作,如果没有导入的话,会看到如下报错:
基于spark的Scala编程—DataFrame操作之select_第1张图片
第三步,使用select接口来操作DataFrame,具体代码如下:

    // 看一下df的数据结构
    LOGGER.info("-------看一下DataFrame的数据结构---------")
    df.printSchema()

    LOGGER.info("-------看一下DataFrame有哪些数据---------")
    df.collect().foreach(println)

    LOGGER.info("-------df.select(\"key1\")---选择某一列的数据,并且打印---------")
    df.select("key1").collect().foreach(println)

    LOGGER.info("-------df.select($\"key1\")---选择某一列的数据,并且打印---------")
    df.select($"key1").collect().foreach(println)

这里说明一下select(“key1”)与select( " k e y 1 " ) 的 区 别 , s e l e c t ( " k e y 1 " ) 只 能 用 D a t a F r a m e 中 的 命 名 字 段 名 而 不 能 对 字 段 名 再 使 用 像 S Q L 的 s e l e c t 语 法 的 表 达 式 。 但 是 s e l e c t ( "key1")的区别,select("key1")只能用DataFrame中的命名字段名而不能对字段名再使用像SQL的select语法的表达式。但是select( "key1")select("key1")DataFrame使SQLselectselect(“key1”)这种写法对应的是select方法的Column参数类型重载,可以支持sql的select语法的。

做上面那个测试之前,我们要先导入spark-sql为我们提供的近200多种内置函数,平常在使用mysql的时候,我们在写SQL的时候会使用到MySQL为我们提供的一些内置函数,如数值函数:求绝对值abs()、平方根sqrt()等,还有其它的字符函数、日期函数、聚合函数等等。使我们利用这些内置函数能够快速实现我们的业务逻辑。在SparkSQL里其实也为我们提供了近两百多种内置函数,我们通过,具体导入如下:

import org.apache.spark.sql.functions._

也可以在SQL语句中直接使用。SparkSQL内置函数分类:聚合函数、集合函数、日期函数、数学函数、混杂函数、非聚合函数、排序函数、字符串函数、UDF函数和窗口函数这10类函数。

下面是两段测试代码:

    // 平常在使用mysql的时候,我们在写SQL的时候会使用到MySQL为我们提供的一些内置函数,如数值函数:求绝对值abs()、平方根sqrt()等,还有其它的字符函数、日期函数、聚合函数等等。使我们利用这些内置函数能够快速实现我们的业务逻辑。在SparkSQL里其实也为我们提供了近两百多种内置函数,我们通过
    import org.apache.spark.sql.functions._
    LOGGER.info("-------看一下df.select(\"upper($'key1')\")的结果---------")
    df.select(upper($"key1")).collect().foreach(println)

    LOGGER.info("-------df.selectExpr(\"upper(key1)\", \"key2 as haha2\")的结果---------")
    df.selectExpr("upper(key1)", "key2 as haha2").show()
    LOGGER.info("-------df.selectExpr(\"upper(key1)\", \"key2 as haha2\")的结果---------")
    df.selectExpr("upper(key1)", "key2 as haha2").collect().foreach(println)

    LOGGER.info("-------看一下df.select(\"upper(key1)\")的结果---------")
    df.select("upper(key1)").collect().foreach(println)

运行结果如下:

你可能感兴趣的:(Spark/Hadoop,Scala)