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. * 注意:
  3. * 1.自定义类必须是可序列化的
  4. * 2.自定义类访问级别必须是Public
  5. * 3.RDD转成DataFrame会把自定义类中字段的名称按assci码排序
  6. */
  7. SparkConf conf = new SparkConf();
  8. conf.setMaster("local").setAppName("RDD");
  9. JavaSparkContext sc = new JavaSparkContext(conf);
  10. SQLContext sqlContext = new SQLContext(sc);
  11. JavaRDD<String> lineRDD = sc.textFile("sparksql/person.txt");
  12. JavaRDD<Person> personRDD = lineRDD.map(new Function<String, Person>() {
  13.  
  14. /**
  15. *
  16. */
  17. private static final long serialVersionUID = 1L;
  18.  
  19. @Override
  20. public Person call(String s) throws Exception {
  21. Person p = new Person();
  22. p.setId(s.split(",")[0]);
  23. p.setName(s.split(",")[1]);
  24. return p;
  25. }
  26. });
  27. /**
  28. * 传入进去Person.class的时候,sqlContext是通过反射的方式创建DataFrame
  29. * 在底层通过反射的方式获得Person的所有field,结合RDD本身,就生成了DataFrame
  30. */
  31. DataFrame df = sqlContext.createDataFrame(personRDD, Person.class);
  32.  
  33. class Person implements Serializable {
  34. private static final long serialVersionUID = -6907013906164009798L;
  35. private String Id;
  36. private String name;
  37.  
  38. public void setId(String appId) {
  39. this.appId = appId;
  40. }
  41.  
  42. public String getId() {
  43. return appId;
  44. }
  45.  
  46. public String getname() {
  47. return detail;
  48. }
  49.  
  50. public void setname(String detail) {
  51. this.detail = detail;
  52. }
  53. }
  1. //方法2:
  2. JavaRDD<String> lineRDD = sc.textFile("./sparksql/person.txt");
  3. /**
  4. * 转换成Row类型的RDD
  5. */
  6. JavaRDD<Row> rowRDD = lineRDD.map(new Function<String, Row>() {
  7.  
  8. /**
  9. *
  10. */
  11. private static final long serialVersionUID = 1L;
  12.  
  13. @Override
  14. public Row call(String s) throws Exception {
  15. return RowFactory.create(//这里字段顺序一定要和下边 StructField对应起来
  16. String.valueOf(s.split(",")[0]),
  17. String.valueOf(s.split(",")[1]),
  18. );
  19. }
  20. });
  21. /**
  22. * 动态构建DataFrame中的元数据,一般来说这里的字段可以来源自字符串,也可以来源于外部数据库
  23. */
  24. List<StructField> asList =Arrays.asList(//这里字段顺序一定要和上边对应起来
  25. DataTypes.createStructField("id", DataTypes.StringType, true),
  26. DataTypes.createStructField("name", DataTypes.StringType, true)
  27. );
  28. StructType schema = DataTypes.createStructType(asList);
  29. /*
  30. StructType schema = new StructType(new StructField[]{
  31. new StructField("id", DataTypes.StringType, false, Metadata.empty()),
  32. new StructField("name", DataTypes.StringType, false, Metadata.empty()),
  33. });
  34. */
  35. //DataFrame df = sqlContext.createDataFrame(List<Row> ,schema)这个方法也可以
  36. DataFrame df = sqlContext.createDataFrame(rowRDD, schema);
  1. //方法3
  2. public static class Person implements Serializable {
  3. private String name;
  4. private int age;
  5.  
  6. public String getName() {
  7. return name;
  8. }
  9.  
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13.  
  14. public int getAge() {
  15. return age;
  16. }
  17.  
  18. public void setAge(int age) {
  19. this.age = age;
  20. }
  21. }
  22.  
  23. // Create an instance of a Bean class
  24. Person person = new Person();
  25. person.setName("Andy");
  26. person.setAge(32);
  27.  
  28. // Encoders are created for Java beans
  29. Encoder<Person> personEncoder = Encoders.bean(Person.class);
  30. Dataset<Person> javaBeanDS = spark.createDataset(
  31. Collections.singletonList(person),
  32. personEncoder
  33. );
  34. javaBeanDS.show();
  35. // +---+----+
  36. // |age|name|
  37. // +---+----+
  38. // | 32|Andy|
  39. // +---+----+
  40.  
  41. // Encoders for most common types are provided in class Encoders
  42. Encoder<Integer> integerEncoder = Encoders.INT();
  43. Dataset<Integer> primitiveDS = spark.createDataset(Arrays.asList(1, 2, 3), integerEncoder);
  44. Dataset<Integer> transformedDS = primitiveDS.map(
  45. (MapFunction<Integer, Integer>) value -> value + 1,
  46. integerEncoder);
  47. transformedDS.collect(); // Returns [2, 3, 4]
  48.  
  49. // DataFrames can be converted to a Dataset by providing a class. Mapping based on name
  50. String path = "examples/src/main/resources/people.json";
  51. Dataset<Person> peopleDS = spark.read().json(path).as(personEncoder);
  52. peopleDS.show();
  53. // +----+-------+
  54. // | age| name|
  55. // +----+-------+
  56. // |null|Michael|
  57. // | 30| Andy|
  58. // | 19| Justin|
  59. // +----+-------+

生成dataset的几种方式的更多相关文章

  1. python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)

    昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...

  2. Pandas 基础(3) - 生成 Dataframe 的几种方式

    这一节想总结一下 生成 Dataframe 的几种方式: CSV Excel python dictionary List of tuples List of dictionary 下面分别一一介绍具 ...

  3. 数据可视化之powerBI技巧(七)从Excel到PowerBI,生成笛卡尔积的几种方式

    假如分别有100个不重复的姓和名,把每个姓和名进行组合匹配,就可以得到一万个不重复的姓名组合,这种完全匹配的方式就是生成一个姓名的笛卡尔积. 下面就来看看生成笛卡尔积的几种方式,为了展现的方便,以5个 ...

  4. spring生成EntityManagerFactory的三种方式

    spring生成EntityManagerFactory的三种方式 1.LocalEntityManagerFactoryBean只是简单环境中使用.它使用JPA PersistenceProvide ...

  5. php 生成word的三种方式

    原文地址 http://www.jb51.net/article/97253.htm 最近工作遇到关于生成word的问题 现在总结一下生成word的三种方法. btw:好像只要是标题带PHP的貌似点击 ...

  6. Android 生成LayoutInflater的三种方式

    通俗的说,inflate就相当于将一个xml中定义的布局找出来. 因为在一个Activity里如果直接用findViewById()的话,对应的是setConentView()的那个layout里的组 ...

  7. 使用NVelocity生成内容的几种方式

    使用NVelocity也有几个年头了,主要是在我的代码生成工具Database2Sharp上使用来生成相关代码的,不过NVelocity是一个非常不错的模板引擎,可以用来生成文件.页面等相关处理,非常 ...

  8. PHP生成word的三种方式

    摘要: 最近工作遇到关于生成word的问题 现在总结一下生成word的三种方法. btw:好像在博客园发表博客只要是标题带PHP的貌似点击量都不是很高(哥哥我标题还是带上PHP了),不知道为什么,估计 ...

  9. 利用"SQL"语句自动生成序号的两种方式

    1.首先,我们来介绍第一种方式: ◆查询的SQL语句如下: select row_number() over (order by name) as rowid, sysobjects.[id] fro ...

随机推荐

  1. 通过nat让内网机器上网

    让内网机器访问不通机房的机器,架构如下 (172.16.10.5)  ----- (172.17.9.109 可以出外网,开启路由转发)  -------  (内网 192.168.36.19 能pi ...

  2. Linux本地数据上传到阿里云OSS

    这篇文章主要是介绍如何将服务器本地的数据上传到阿里云OSS的指定bucket中,最重要的参考文档是数据迁移单机部署.我第一次上传数据到OSS上时,步骤要比前面的链接中介绍的要麻烦,ossimport工 ...

  3. iOS之禁止所有输入法的表情

    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSSt ...

  4. office365离线安装

    office版本是在线安装,每次安装比较麻烦,所以还是离线安装合适,这里推荐一篇博文https://www.cnblogs.com/Devopser/p/7919245.html 但是由于部署工具变化 ...

  5. Ubuntu SSH登陆出现Access Denied错误

    在/etc/ssh/sshd_config 中有个 PermitRootLogin, 改成“PermitRootLogin yes”就可以了 重启ssh: /etc/init.d/ssh restar ...

  6. python里的默认参数

    def extendList(val, test=[]): test.append(val) return test list1 = extendList(10) list2 = extendList ...

  7. PHP结合zyupload多功能图片上传实例

    PHP结合zyupload多功能图片上传实例,支持拖拽和裁剪.可以自定义高度和宽度,类型,远程上传地址等. zyupload上传基本配置 $("#zyupload").zyUplo ...

  8. Leecode刷题之旅-C语言/python-326 3的幂

    /* * @lc app=leetcode.cn id=326 lang=c * * [326] 3的幂 * * https://leetcode-cn.com/problems/power-of-t ...

  9. SQL学习笔记:分块提取查询结果

    实践中,数据库中可能有数十亿条记录.查询结果有可能达到千万条.如果用dbGetQuery( ) 一次性取出所有查询结果,内存可能吃不消.但是,如果容许分块处理数据来完成任务,那么下述方法不失为一个好的 ...

  10. ACM--移动桌子--贪心--HDOJ 1050--Moving Tables

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Descript ...