一、 scala版本
1.1:用javabean类型的rdd创建
val sparkConf = new SparkConf().setMaster("local").setAppName("adaa") val sc = new SparkContext(sparkConf)
var sqlcontext = new SQLContext(sc)
var rdd:RDD[Emp]= sc.parallelize(Array( "1 zhangsan 3000 20", "2 lisi 4000 10", "3 wangwu 8000 20", "4 zhaoliu 1000 20" )).flatMap(line =>{ var arr = line.split("\\s+")
var empno:Int = arr(0).toInt var ename:String = arr(1) var sal:Int = arr(2).toInt var deptno:Int = arr(3).toInt Array(Emp(empno,ename,sal,deptno)) }
var dataframe = sqlcontext.createDataFrame(rdd, Class.forName("a.Emp")) # 注意: 1. var rdd:RDD[Emp] ,此变量中存放的是Emp类的对象, 所以,在通过RDD创建DataFrame时需要相应的加载Emp的类,此操作的语句即:sqlcontext.createDataFrame(rdd, Class.forName("a.Emp")) Class.forName("a.Emp") 是类加载器,来加载rdd中存储的元素的类。 2.rdd.flatmap这个算子,参数是一个函数,这个函数的作用就是将rdd中的每个元素变成Array类型的数组,在flatmap隐藏的代码中会将每个小数组都遍历一遍,放入我们的大数组中,就是将集合压成一个。 # registerTempTable注册成为一张表,从而可以通过DataFrame的sql算子进行数据库的操作。 #在sql语句中的 列名(empno)是怎么来的哪? 是取自createDataFrame(rdd, Class.forName("a.Emp")), 这个类a.Emp的get方法名(def getEmpno = eno),去掉get首字母小写得到的。一定要注意,这是一个默认的取列名的方式。
dataframe.registerTempTable("emp") var newdataframe = sqlcontext.sql("select empno from emp") newdataframe.show() } } |
1.1中要用的类 package a // "1 zhangsan 3000 20", class Emp(empno:Int,ename:String,sal:Int,deptno:Int) { def this(){ this(0,null,0,0) } |