-
DataFrame与RDD的区别
-
DataFrame select、filter的使用说明
//隐式转换必须加上,如果不加,第二种、第三种就会报错 import spark.implicits._ //这里面的spark是指sparksession而不是引入的包 //第一种方式 moviesDF.select("title") //第二种方式 moviesDF.select($"title") //第三种方式 moviesDF.select('title) //如果用filter取出相等操作,需要用三个= moviesDF.filter($"age" === 21).show() //使用了groupby之后最好使用agg,而不是直接使用sum,如下面示例 agg(Map( "salary" -> "avg", "age" -> "max" )) //如果想使用下面这种写法,需要引入内置函数 import org.apache.spark.sql.functions._ InfoDF.groupBy("domain").agg(sum("responseSize"))
-
DataFrame show的使用说明
def show(numRows: Int): Unit = show(numRows, truncate = true) /** * Displays the top 20 rows of Dataset in a tabular form. Strings more than 20 characters * will be truncated, and all cells will be aligned right. * * @group action * @since 1.6.0 */ def show(): Unit = show(20) /** * Displays the top 20 rows of Dataset in a tabular form. * * @param truncate Whether truncate long strings. If true, strings more than 20 characters will * be truncated and all cells will be aligned right * * @group action * @since 1.6.0 */ def show(truncate: Boolean): Unit = show(20, truncate)
源码中指出,show默认显示前20行,也可以自己指定显示行数
truncate = true表示字段的值会截取前20个字符,后面有…来表示,如果想全部显示,需要调用show(false) -
RDD->DataSet(非常重要)
下面两种构造DataFrame的方式,自定义schema用的较多,因为用反射机制的前提是已经知道了schema的信息,而很多时候,schema是无法用case class方式定义,比如对于不同的用户需要生成不同的schema,这时候就需要用编程的方式去自定义schema-
反射机制
定义一个case classcase class People(name:String,age:Int)
将rdd转化成people对象然后直接转化成DF
import sparkSession.implicits._ //创建RDD val info = sparkSession.sparkContext.textFile("file:////Users/apple/Desktop/people.txt") val df = info.map(line=>line.split(",")).map(attr=>People(attr(0),attr(1).trim.toInt)).toDF
当直接对df执行map操作时
df.map(x=>x(0)).show() Error:(24, 11) Unable to find encoder for type stored in a Dataset. Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._ Support for serializing other types will be added in future releases. df.rdd.map(x=>x(0)).collect().foreach(println) //需要调用rdd df.rdd.map(x=>x.getAs[String]("name")).collect().foreach(println) //另一种写法
-
自定义schema*****
分三个步骤:
1.从原始RDD创建一个Row类型的RDDval rowRDD = info.map(line => line.split(",")).map(attr => Row(attr(0), attr(1).trim.toInt))
2.创建一个StructType类型的schema与rowRDD进行匹配
//不要采用官网这种写法,因为有的字段可能不是StringType,但是这种写法所有字段都是StringType val fields = schemaString.split(" ") .map(fieldName => StructField(fieldName, StringType, nullable = true)) val schema = StructType(fields) //工作中采用这种方式来定义schema val struct = StructType(Array(StructField("name", StringType, true), StructField("age", IntegerType, true) )) val df = sparkSession.createDataFrame(rowRDD,struct)
-
-
df的api方法
所有的方法都在functions.scala中 -
自定义UDF函数
首先定义一个函数def parseName(name:String):String={ "kaola"+name }
注册函数
sparkSession.udf.register("parseName",parseName _) //_表示默认参数 或者 sparkSession.udf.register("parseName",(name:String)=>{ "kaola"+name }
使用函数
sparkSession.sql("select parseName(name) as name,age from people").show()
【第二天】Spark SQL
最新推荐文章于 2024-08-29 17:06:49 发布