生成dataset的几种方式
1.常用的方式通过sparksession读取外部文件或者数据生成dataset(这里就不讲了)
注: 生成Row对象的方法提一下:RowFactory.create(x,y,z),取Row中的数据使用row.getAs("列名")来获取对应的列值或者row.getInt(0),row.getString(1)(但这个要注意顺序)
2.通过调用createDataFrame生成Dataset
通过反射的方式将非json格式的RDD转换成DataFrame(不建议使用)
自定义类要可序列化
自定义类的访问级别是Public
RDD转成DataFrame后会根据映射将字段按Assci码排序
将DataFrame转换成RDD时获取字段两种方式,一种是df.getInt(0)下标获取(不推荐使用),另一种是df.getAs(“列名”)获取(推荐使用)
关于序列化问题:
1.反序列化时serializable 版本号不一致时会导致不能反序列化。
2.子类中实现了serializable接口,父类中没有实现,父类中的变量不能被序列化,序列化后父类中的变量会得到null。
注意:父类实现serializable接口,子类没有实现serializable接口时,子类可以正常序列化
3.被关键字transient修饰的变量不能被序列化。
4.静态变量不能被序列化,属于类,不属于方法和对象,所以不能被序列化。
另外:一个文件多次writeObject时,如果有相同的对象已经写入文件,那么下次再写入时,只保存第二次写入的引用,读取时,都是第一次保存的对象。
- /**方法1
- * 注意:
- * 1.自定义类必须是可序列化的
- * 2.自定义类访问级别必须是Public
- * 3.RDD转成DataFrame会把自定义类中字段的名称按assci码排序
- */
- SparkConf conf = new SparkConf();
- conf.setMaster("local").setAppName("RDD");
- JavaSparkContext sc = new JavaSparkContext(conf);
- SQLContext sqlContext = new SQLContext(sc);
- JavaRDD<String> lineRDD = sc.textFile("sparksql/person.txt");
- JavaRDD<Person> personRDD = lineRDD.map(new Function<String, Person>() {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- @Override
- public Person call(String s) throws Exception {
- Person p = new Person();
- p.setId(s.split(",")[0]);
- p.setName(s.split(",")[1]);
- return p;
- }
- });
- /**
- * 传入进去Person.class的时候,sqlContext是通过反射的方式创建DataFrame
- * 在底层通过反射的方式获得Person的所有field,结合RDD本身,就生成了DataFrame
- */
- DataFrame df = sqlContext.createDataFrame(personRDD, Person.class);
- class Person implements Serializable {
- private static final long serialVersionUID = -6907013906164009798L;
- private String Id;
- private String name;
- public void setId(String appId) {
- this.appId = appId;
- }
- public String getId() {
- return appId;
- }
- public String getname() {
- return detail;
- }
- public void setname(String detail) {
- this.detail = detail;
- }
- }
- //方法2:
- JavaRDD<String> lineRDD = sc.textFile("./sparksql/person.txt");
- /**
- * 转换成Row类型的RDD
- */
- JavaRDD<Row> rowRDD = lineRDD.map(new Function<String, Row>() {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- @Override
- public Row call(String s) throws Exception {
- return RowFactory.create(//这里字段顺序一定要和下边 StructField对应起来
- String.valueOf(s.split(",")[0]),
- String.valueOf(s.split(",")[1]),
- );
- }
- });
- /**
- * 动态构建DataFrame中的元数据,一般来说这里的字段可以来源自字符串,也可以来源于外部数据库
- */
- List<StructField> asList =Arrays.asList(//这里字段顺序一定要和上边对应起来
- DataTypes.createStructField("id", DataTypes.StringType, true),
- DataTypes.createStructField("name", DataTypes.StringType, true)
- );
- StructType schema = DataTypes.createStructType(asList);
- /*
- StructType schema = new StructType(new StructField[]{
- new StructField("id", DataTypes.StringType, false, Metadata.empty()),
- new StructField("name", DataTypes.StringType, false, Metadata.empty()),
- });
- */
- //DataFrame df = sqlContext.createDataFrame(List<Row> ,schema)这个方法也可以
- DataFrame df = sqlContext.createDataFrame(rowRDD, schema);
- //方法3
- public static class Person implements Serializable {
- private String name;
- private int age;
- 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;
- }
- }
- // Create an instance of a Bean class
- Person person = new Person();
- person.setName("Andy");
- person.setAge(32);
- // Encoders are created for Java beans
- Encoder<Person> personEncoder = Encoders.bean(Person.class);
- Dataset<Person> javaBeanDS = spark.createDataset(
- Collections.singletonList(person),
- personEncoder
- );
- javaBeanDS.show();
- // +---+----+
- // |age|name|
- // +---+----+
- // | 32|Andy|
- // +---+----+
- // Encoders for most common types are provided in class Encoders
- Encoder<Integer> integerEncoder = Encoders.INT();
- Dataset<Integer> primitiveDS = spark.createDataset(Arrays.asList(1, 2, 3), integerEncoder);
- Dataset<Integer> transformedDS = primitiveDS.map(
- (MapFunction<Integer, Integer>) value -> value + 1,
- integerEncoder);
- transformedDS.collect(); // Returns [2, 3, 4]
- // DataFrames can be converted to a Dataset by providing a class. Mapping based on name
- String path = "examples/src/main/resources/people.json";
- Dataset<Person> peopleDS = spark.read().json(path).as(personEncoder);
- peopleDS.show();
- // +----+-------+
- // | age| name|
- // +----+-------+
- // |null|Michael|
- // | 30| Andy|
- // | 19| Justin|
- // +----+-------+
生成dataset的几种方式的更多相关文章
- python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)
昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...
- Pandas 基础(3) - 生成 Dataframe 的几种方式
这一节想总结一下 生成 Dataframe 的几种方式: CSV Excel python dictionary List of tuples List of dictionary 下面分别一一介绍具 ...
- 数据可视化之powerBI技巧(七)从Excel到PowerBI,生成笛卡尔积的几种方式
假如分别有100个不重复的姓和名,把每个姓和名进行组合匹配,就可以得到一万个不重复的姓名组合,这种完全匹配的方式就是生成一个姓名的笛卡尔积. 下面就来看看生成笛卡尔积的几种方式,为了展现的方便,以5个 ...
- spring生成EntityManagerFactory的三种方式
spring生成EntityManagerFactory的三种方式 1.LocalEntityManagerFactoryBean只是简单环境中使用.它使用JPA PersistenceProvide ...
- php 生成word的三种方式
原文地址 http://www.jb51.net/article/97253.htm 最近工作遇到关于生成word的问题 现在总结一下生成word的三种方法. btw:好像只要是标题带PHP的貌似点击 ...
- Android 生成LayoutInflater的三种方式
通俗的说,inflate就相当于将一个xml中定义的布局找出来. 因为在一个Activity里如果直接用findViewById()的话,对应的是setConentView()的那个layout里的组 ...
- 使用NVelocity生成内容的几种方式
使用NVelocity也有几个年头了,主要是在我的代码生成工具Database2Sharp上使用来生成相关代码的,不过NVelocity是一个非常不错的模板引擎,可以用来生成文件.页面等相关处理,非常 ...
- PHP生成word的三种方式
摘要: 最近工作遇到关于生成word的问题 现在总结一下生成word的三种方法. btw:好像在博客园发表博客只要是标题带PHP的貌似点击量都不是很高(哥哥我标题还是带上PHP了),不知道为什么,估计 ...
- 利用"SQL"语句自动生成序号的两种方式
1.首先,我们来介绍第一种方式: ◆查询的SQL语句如下: select row_number() over (order by name) as rowid, sysobjects.[id] fro ...
随机推荐
- 通过nat让内网机器上网
让内网机器访问不通机房的机器,架构如下 (172.16.10.5) ----- (172.17.9.109 可以出外网,开启路由转发) ------- (内网 192.168.36.19 能pi ...
- Linux本地数据上传到阿里云OSS
这篇文章主要是介绍如何将服务器本地的数据上传到阿里云OSS的指定bucket中,最重要的参考文档是数据迁移单机部署.我第一次上传数据到OSS上时,步骤要比前面的链接中介绍的要麻烦,ossimport工 ...
- iOS之禁止所有输入法的表情
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSSt ...
- office365离线安装
office版本是在线安装,每次安装比较麻烦,所以还是离线安装合适,这里推荐一篇博文https://www.cnblogs.com/Devopser/p/7919245.html 但是由于部署工具变化 ...
- Ubuntu SSH登陆出现Access Denied错误
在/etc/ssh/sshd_config 中有个 PermitRootLogin, 改成“PermitRootLogin yes”就可以了 重启ssh: /etc/init.d/ssh restar ...
- python里的默认参数
def extendList(val, test=[]): test.append(val) return test list1 = extendList(10) list2 = extendList ...
- PHP结合zyupload多功能图片上传实例
PHP结合zyupload多功能图片上传实例,支持拖拽和裁剪.可以自定义高度和宽度,类型,远程上传地址等. zyupload上传基本配置 $("#zyupload").zyUplo ...
- Leecode刷题之旅-C语言/python-326 3的幂
/* * @lc app=leetcode.cn id=326 lang=c * * [326] 3的幂 * * https://leetcode-cn.com/problems/power-of-t ...
- SQL学习笔记:分块提取查询结果
实践中,数据库中可能有数十亿条记录.查询结果有可能达到千万条.如果用dbGetQuery( ) 一次性取出所有查询结果,内存可能吃不消.但是,如果容许分块处理数据来完成任务,那么下述方法不失为一个好的 ...
- ACM--移动桌子--贪心--HDOJ 1050--Moving Tables
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Descript ...