使用Java和Scala在IDE中实战RDD和DataFrame转换操作
来源:互联网 发布:网络思想政治教育报告 编辑:程序博客网 时间:2024/06/05 15:03
一. RDD与DataFrame转换的重大意义
在Spark中RDD可以直接转换成DataFrame。SparkCore的核心是RDD,所有的调度都是基于RDD完成的,对RDD的操作都可以转换成基于DataFrame使用SparkSQL来操作。RDD可能接上数据库,接上NoSQL,其他文件系统等各种数据来源,然后将数据转换为DataFrame,
极大简化了大数据的开发,原来写Scala\Java,现在只需要写SparkSQL。
同时对DataFrame的操作又可以转换成RDD,基于DataFrame对数据进行SQL或机器学习等操作后又可以转换为RDD,这对于保存数据、格式化非常方便。
RDD变DataFrame有两种方式:
1.通过反射,推断RDD元素中的元数据。
RDD中的数据本身是没有元数据的,例如一个Person的信息里有id/name/age,RDD的Record不知道id/name/age这些信息,但如果变成DataFrame的话,DataFrame必须知道这些信息。如何在RDD和DataFrame转换时拥有这些元数据信息呢?最简单的就是通过反射。
在Scala中就是Case Class映射。写一个Case Class,描述RDD中不同列的元数据是什么。
在Java中就是通过JavaBean。
Scala:case class映射。
Java:Bean(但不能支持嵌套的JavaBean,也不能有List/Map等复杂的数据结构。只能用简单的数据类型:String/Int等。Scala就没有这些限制)
使用反射的前提:已经知道元数据信息了(静态的)。但有些场景下只有在运行时才能知道元数据信息(动态的)
- 创建DataFrame时事先不知道元数据信息,只能在运行时动态构建元数据。然后再把这些元数据信息应用于RDD上。这种情况是比较常见的情况,即动态获取Schema。
Java代码
import java.io.Serializable;import java.util.List;import org.apache.spark.*;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.api.java.JavaSparkContext;import org.apache.spark.api.java.function.Function;import org.apache.spark.sql.DataFrame;import org.apache.spark.sql.Row;import org.apache.spark.sql.SQLContext;public class DataFrameops { public static void main(String[] args) { SparkConf conf=new SparkConf(); conf.setAppName("DataFrame"); conf.setMaster("local"); JavaSparkContext sc=new JavaSparkContext(conf); SQLContext sqlContext=new SQLContext(sc); JavaRDD<String> lines=sc.textFile("C:\\Users\\Administrator\\Desktop\\1.txt"); JavaRDD<persion> persions=lines.map(new Function<String, persion>() { public persion call(String line) throws Exception { // TODO Auto-generated method stub String[] splited=line.split(","); persion p=new persion(); p.setId(Integer.valueOf(splited[0].trim())); p.setName(splited[1]); p.setAge(Integer.valueOf(splited[2].trim())); return p; } }); /**reateDataFrame方法来自于sqlContext,有两个参数,第一个是RDD,这里就是lines.map之后的persons*这个RDD里的类型是person,即每条记录都是person,person其实是有id,name,age的,*JavaRDD本身并不知道id,name,age信息,所以要创建DataFrame,DataFrame需要知道id,name,age信息,*DataFrame怎么知道的呢?这里用createDataFrame时传入两个参数,第一个的RDD本身,第二个参数是*对RDD中每条数据的元数据的描述,这里就是java bean class,即person.class*实际上工作原理是:person.class传入时本身会用反射的方式创建DataFrame,*在底层通过反射的方式获得Person的所有fields,结合RDD本身,就生成了DataFrame*/ //在底层通过反射的方式获得periosn所有的field(属性),结合RDD本省,生成了DataFrame DataFrame df=sqlContext.createDataFrame(persions, persion.class); //将DataFrame变成一个TempTable。 df.registerTempTable("persionss"); //在内存中就会生成一个persons的表,在这张临时表上就可以写SQL语句了。 DataFrame bigDatas=sqlContext.sql("select*from persionss"); //转过来就可以把查询后的结果变成 RDD。返回的是JavaRDD<Row> JavaRDD<Row> bigDataRdd=bigDatas.javaRDD(); //注意:这里需要导入org.apache.spark.sql.Row/再对RDD进行map操作。元素是一行一行的数据(SQL的Row),结果是Person,再次还原成Person。//这里返回的是具体的每条RDD的元素。 JavaRDD<persion> result=bigDataRdd.map(new Function<Row, persion>() { public persion call(Row row) throws Exception { // TODO Auto-generated method stub persion p=new persion(); p.setId(row.getInt(1)); p.setName(row.getString(2)); p.setAge(row.getInt(0)); return p; //数据读进来时第一列是id,第二列是name,第三列是age,生成的RDD也是这个顺序,//变成DataFrame后,DataFrame有自己的优化引擎,优化(数据结构优化等)之后再进行处理,//处理后再变成RDD时就不能保证第一列是id,第二列是name,第三列是age了。//原因是DataFrame对数据进行了排序。 } }); List<persion> persionslist=result.collect(); for (persion p : persionslist) { System.out.println(p); } } }
import java.io.Serializable;public class persion implements Serializable { public int id; public String name; public int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "persion [id=" + id + ", name=" + name + ", age=" + age + "]"; }}
- 使用Java和Scala在IDE中实战RDD和DataFrame转换操作
- 使用Java和Scala在IDE中实战RDD和DataFrame动态转换操作
- 第59课:使用Java和Scala在IDE中实战RDD和DataFrame转换操作’学习笔记
- 第60课:使用Java和Scala在IDE中实战RDD和DataFrame动态转换操作学习笔记
- SPARK 使用Java 在IDE中实战RDD和DataFrame动态转换操作
- 大数据IMF传奇行动绝密课程第59课:使用Java和Scala在IDE中实战RDD和DataFrame转换操作
- 大数据IMF传奇行动绝密课程第60课:使用Java和Scala在IDE中实战RDD和DataFrame动态转换操作
- 使用Java和Scala在IDE中开发DataFrame实战
- 使用Java和Scala在IDE中开发DataFrame实战
- 使用Java实战RDD和DataFrame转换操作
- 第58课:使用Java和Scala在IDE中开发DataFrame实战学习笔记
- 第58课:使用Java和Scala在IDE中开发DataFrame实战学习笔记
- 使用Java和Scala在IDE中开发DataFrame
- RDD和DataFrame转换(Java+Scala)
- 大数据IMF传奇行动绝密课程第58课:使用Java和Scala在IDE中开发DataFrame实战
- 利用JAVA、SCALA实现RDD和DataFrame转换
- 使用java 将 Spark RDD和DataFrame转换
- Spark中RDD转换成DataFrame的两种方式(分别用Java和scala实现)
- 多个apk共享进程
- curl
- 设计模式(六)抽象工程模式
- hibernate三大查询所有对象
- 设计模式-单例模式
- 使用Java和Scala在IDE中实战RDD和DataFrame转换操作
- 自定义标签
- 广告策略评估指标(算法实习day2)
- javaSwing_2环境搭建
- Java泛型数组
- Sql Server 'Saving changes is not permitted' error Prevent saving changes that require table re-cr
- cookie和session
- PostgreSQL入门教程
- 五谷杂粮加盟运营是经济的新趋势