本文主要是写关于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操作,如果没有导入的话,会看到如下报错:
第三步,使用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中的命名字段名而不能对字段名再使用像SQL的select语法的表达式。但是select(“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)
运行结果如下: