Spark(六):DataFrame

Spark(六):DataFrame,第1张

Spark(六):DataFrame

文章目录
  • 说明
  • 分享
  • 记录
    • 特性
    • 接口
    • 一般处理流程
    • 优点
    • 缺点
  • 代码实例
  • spark与RDD对比
  • 总结

说明

由于某些原因,上周五未发布博客未,本文补上。
Dataframe是一种spark 1.3版本提供Spark SQL接口下的分布式数据集,继承自DataSet数据集,该概念最早由R语言和Pandas库(Python)提出。
Dataframe更像传统数据库里的表,除了数据外还包含更多的辅助信息,如列名、列值和列的属性,同时支持一些复杂的数据格式。从API应用的角度,Dataframe提供的API层次更高,比RDD编程方便,学习的门槛更低。

分享
  • 大数据博客列表
记录 特性
  1. Dataframe会将数据分割成列,并为每列取名,概念上等同于关系型数据库中表或R、Python中的数据框。

  2. 可以处理结构化和非结构化数据格式。例如Avro、CSV、d性搜索和Cassandra。它还处理存储系统HDFS、HIVE表、MySQL等。

  3. Catalyst的通用树转换框架分为四个阶段,如下所示:

    • 分析解决引用的逻辑计划
    • 逻辑计划优化,
    • 物理计划
    • 代码生成用于编译部分查询生成Java字节码。

在物理规划阶段,Catalyst可能会生成多个计划并根据成本进行比较。 所有其他阶段完全是基于规则的。 每个阶段使用不同类型的树节点; Catalyst包括用于表达式、数据类型以及逻辑和物理运算符的节点库。 这些阶段如下所示:

接口
  • Dataframe API支持Scala、java、python、R,它作为行数据集,在Scala API中Dataframe是DataSet[Row]的类型别名,Java中使用数据集表示。
  • SparkSession是所有Spark功能入口,应用程序通过它能从现存RDD或Hive Table、Spark数据源中创建DataFram。Spark SQL能对多种数据源使用Dataframe接口,使用SparkSQL Dataframe创建临时视图,然后执行Sql查询。
一般处理流程
  1. 先创建Spark基础变量,spark,sc
  2. 加载数据,rdd.textFile,spark.read.csv/json等
  3. 数据处理,mapPartition, map,filter,reduce等一系列transformation *** 作
  4. 数据保存,saveAstextFile,或者其他Dataframe方法
优点

Dataframe优于RDD,因为它提供了内存管理和优化执行计划:

  1. 自定义内存管理,当数据以二进制格式存储在堆外内存时,将节省大量内存,除此之外,没有垃圾回收(GC)开销。同时避免了昂贵的java序列化,因为数据以二进制格式存储,且已知内存schema。
  2. 优化执行计划:也称为查询优化器,查询执行时,创建一个优化的执行计划,并将计划运行在RDD上。
缺点
  1. Spark SQL Dataframe API不支持编译时类型安全,如果结构未知,不能 *** 作数据。
  2. 一旦将域对象转化为Dataframe,域对象不能重构。
代码实例

java代码创建简单Dataframe,JSON格式RDD创建Dataframe:

SparkConf conf = new SparkConf();
conf.setMaster("local").setAppName("jsonRDD");  //主机地址和应用名
JavaSparkContext sc = new JavaSparkContext(conf);
SQLContext sqlContext = new SQLContext(sc);
JavaRDD nameRDD = sc.parallelize(Arrays.asList(
    "{"name":"zhangsan","age":"18"}",
    "{"name":"lisi","age":"19"}",
    "{"name":"wangwu","age":"20"}"
));
JavaRDD scoreRDD = sc.parallelize(Arrays.asList(
"{"name":"zhangsan","score":"100"}",
"{"name":"lisi","score":"200"}",
"{"name":"wangwu","score":"300"}"
));
 
Dataframe namedf = sqlContext.read().json(nameRDD);  //RDD转换Dataframe
Dataframe scoredf = sqlContext.read().json(scoreRDD); //RDD转换Dataframe
namedf.registerTempTable("name");  //注册临时表
scoredf.registerTempTable("score");
 
Dataframe result = sqlContext.sql("select name.name,name.age,score.score from name,score where name.name = score.name");  //sql查询 
result.show();
 
sc.stop();
spark与RDD对比

Dataframe与RDD类似,但Dataframe更像传统数据库的二维表格,除了数据以外,还掌握数据的结构信息,即schema。同时,与Hive类似,Dataframe也支持嵌套数据类型(struct、array和map)。

总结

spark Dataframe本质是将数据映射为表,在此基础上完成sql方式业务功能开发。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5677561.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存