一,基本介绍 本文主要讲spark2.0版本以后存在的Sparksql的一些实用的函数,帮助解决复杂嵌套的json数据格式,比如,map和嵌套结构。...schema,我在这里创建一个Dataframe,使用的是scala 的case class,同时会产生一些json格式的数据。...这个case class总共有两个字段:整型(作为device id)和一个字符串(json的数据结构,代表设备的事件) // define a case class case class DeviceData...还有,我们也可以将所有在json中的属性和值当做一个devices的实体。我们不仅可以使用device.arrtibute去获取特定值,也可以使用*通配符。...下面的例子,主要实现如下功能: A),使用上述schema从json字符串中抽取属性和值,并将它们视为devices的独立列。 B),select所有列 C),使用.,获取部分列。
一,准备阶段 Json格式里面有map结构和嵌套json也是很合理的。本文将举例说明如何用spark解析包含复杂的嵌套数据结构,map。...二,如何使用explode() Explode()方法在spark1.3的时候就已经存在了,在这里展示一下如何抽取嵌套的数据结构。...在一些场合,会结合explode,to_json,from_json一起使用。 Explode为给定的map的每一个元素创建一个新的行。比如上面准备的数据,source就是一个map结构。...,我们可以使用所有的dataset的方法来进行ETL操作,比如from_json(), to_json(), explode() and selectExpr()。...($"*"))).toDF("nestDevice") 3,将三个json object 的map对象抓化为三个单独的map列,然后可以是使用explode方法访问其属性。
虽然编码器和标准序列化都负责将对象转换成字节,但编码器是动态生成的代码,使用的格式允许Spark执行许多操作,如过滤、排序和哈希,而无需将字节反序列化回对象。 ...在实际使用的时候, 很少用到把序列转换成 DataSet, 更多的是通过RDD来得到DataSet 1.2 RDD 和 DataSet 的交互 1....为 Spark SQL 设计的 Scala API 可以自动的把包含样例类的 RDD 转换成 DataSet. 样例类定义了表结构: 样例类参数名通过反射被读到, 然后成为列名. ...DataFrame 和 DataSet 之间的交互 1....从 DataFrame到DataSet scala> val df = spark.read.json("examples/src/main/resources/people.json") df: org.apache.spark.sql.DataFrame
第1章 Spark SQL概述 什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了2个编程抽象:DataFrame和DataSet,并且作为分布式SQL查询引擎的作用...DataFrame 创建在Spark SQL中SparkSession是创建DataFrame和执行SQL的入口,创建DataFrame有三种方式:通过Spark的数据源进行创建;从一个存在的RDD进行转换...: string, age: bigint] RDD转换为DataSet SparkSQL能够自动将包含有case类的RDD转换成DataFrame,case类定义了table的结构,case类属性通过反射变成了表的列名...在对DataFrame跟DataSet进行许多操作都要import spark.implicits._ DataFrame跟DataSet均可使用模式匹配获取各个字段的值跟类型。...默认数据源Parquet Parquet是一种流行的列式存储格式,可以高效的存储具有嵌套字段的记录,Parquet格式经常在Hadoop生态圈使用,它也支持SparkSQL的全部数据类型,SparkSQL
这些是用于处理结构化数据(例如数据库表,JSON文件)的高级API,这些 API 可让 Spark 自动优化存储和计算。...= "") Spark2.0以上版本,sqlContext 可以使用 SparkSeesion 替换。...无缝支持半结构化数据 Encoder 的功能不仅仅在性能方面。它们还可以作为半结构化格式(例如JSON)和类型安全语言(如Java和Scala)之间的桥梁。...例如,如果我们尝试使用太小的数据类型,例如转换为对象会导致截断(即numStudents大于一个字节,最大值为255),分析器将发出AnalysisException。...Java和Scala统一API DataSets API 的另一个目标是提供可在 Scala 和 Java 中使用的统一接口。
然而DataFrame更像传统数据库的二维表格,除了数据以外,还记录数据的结构信息,即schema。同时,与Hive类似,DataFrame也支持嵌套数据类型(struct、array和map)。...5) Dataframe是Dataset的特列,DataFrame=Dataset[Row] ,所以可以通过as方法将Dataframe转换为Dataset。...就跟JSON对象和类对象之间的类比。 ?...= df1.rdd rdd1.foreach(row=>{ println(row.getString(1)) }) //释放资源 spark.stop 4、RDD和DataSet之间相互转换 scala...//使用聚合函数 val frame = spark.read.json("data/user.json") frame.createOrReplaceTempView("user
上的行为更改 从 Spark SQL 1.0-1.2 升级到 1.3 重命名 DataFrame 的 SchemaRDD Java 和 Scala APIs 的统一 隔离隐式转换和删除...使用反射推断Schema Scala Java Python Spark SQL 的 Scala 接口支持自动转换一个包含 case classes 的 RDD 为 DataFrame.Case...在 Scala 中,DataFrame 变成了 Dataset[Row] 类型的一个别名,而 Java API 使用者必须将 DataFrame 替换成 Dataset。...它可以通过设置 spark.sql.parquet.mergeSchema 到 true 以重新启用。 字符串在 Python 列的 columns(列)现在支持使用点(.)来限定列或访问嵌套值。...当使用 DSL 内部的函数时(现在使用 DataFrame API 来替换), 用户习惯导入 org.apache.spark.sql.catalyst.dsl.
同时,与 Hive 类似,DataFrame 也支持嵌套数据类型(struct、array 和 map)。...上图直观地体现了 DataFrame 和 RDD 的区别。左侧的 RDD[Person] 虽然以 Person 为类型参数,但 Spark 框架本身不了解 Person 类的内部结构。...而右侧的 DataFrame 却提供了详细的结构信息,使得 Spark SQL 可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。DataFrame 多了数据的结构信息,即 schema。...6、在对 DataFrame 和 DataSet 进行许多操作都需要这个包进行支持 import spark.implicits._ 7、DataFrame 和 DataSet 均可使用模式匹配获取各个字段的值和类型...=line.getAs[String]("col2") } 每一列的值没法直接访问 2、DataFrame 与 DataSet 一般与 spark ml 同时使用 3、DataFrame 与 DataSet
比如我们常用的创建DateFrame和DataTable方式就那么一种或则两种,如果更多那就看不懂了。在比如想测试下程序的性能,这时候如果自己写,那就太麻烦了,可以使用spark提供的Time函数。...conf函数 public RuntimeConfig conf() 运行spark 配置接口 通过这个接口用户可以设置和获取与spark sql相关的所有Spark 和Hadoop配置.当获取config...需要确保每行的RDD结构匹配提供的schema,否则将会运行异常。例如: [Scala] 纯文本查看 复制代码 ?...这个方法需要encoder (将T类型的JVM对象转换为内部Spark SQL表示形式)。...sql函数 public Dataset sql(String sqlText) 使用spark执行sql查询,作为DataFrame返回结果。
在Spark 1.3.0以Spark SQL原有的SchemaRDD为蓝本,引入了Spark DataFrame API,不仅为Scala、Python、Java三种语言环境提供了形如R和Pandas的...同时,与Hive类似,DataFrame也支持嵌套数据类型(struct、array和map)。...而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。...下图对比了用Scala、Python的RDD API和DataFrame API实现的累加一千万整数对的四段程序的性能对比。...值得注意的是,不仅Python API有了显著的性能提升,即便是使用Scala,DataFrame API的版本也要比RDD API快一倍。
Spark SQL是Spark的一个组件,用于结构化数据的计算。...(); 2.3 DataFrame操作(DataFrame Operations) DataFrames支持Scala、Java和Python的操作接口。...Spark SQL支持将JavaBean的RDD自动转换成DataFrame。...通过反射获取Bean的基本信息,依据Bean的信息定义Schema。当前Spark SQL版本(Spark 1.5.2)不支持嵌套的JavaBeans和复杂数据类型(如:List、Array)。...该方法将String格式的RDD或JSON文件转换为DataFrame。 需要注意的是,这里的JSON文件不是常规的JSON格式。JSON文件每一行必须包含一个独立的、自满足有效的JSON对象。
SparkSQL支持查询原生的RDD。 RDD是Spark平台的核心概念,是Spark能够高效的处理大数据的各种场景的基础。 能够在Scala中写SQL语句。...同时,与Hive类似,DataFrame也支持嵌套数据类型(struct、array和map)。...创建DataFrame的几种方式 1、读取json格式的文件创建DataFrame json文件中的json数据不能嵌套json格式数据。...格式的RDD创建DataFrame(重要) 1) 通过反射的方式将非json格式的RDD转换成DataFrame(不建议使用) 自定义类要可序列化 自定义类的访问级别是Public RDD转成DataFrame...1) 动态创建Schema将非json格式的RDD转换成DataFrame(建议使用) java: SparkConf conf = new SparkConf(); conf.setMaster("
,编写SQL 03-[掌握]-Dataset 是什么 Dataset是在Spark1.6中添加的新的接口,是DataFrame API的一个扩展,是Spark最新的数据抽象,结合了RDD和DataFrame...针对Dataset数据结构来说,可以简单的从如下四个要点记忆与理解: Spark 框架从最初的数据结构RDD、到SparkSQL中针对结构化数据封装的数据结构DataFrame, 最终使用Dataset...() } } 04-[掌握]-RDD、DS和DF之间转换 实际项目开发,常常需要对RDD、DataFrame及Dataset之间相互转换,其中要点就是Schema约束结构信息。...,封装到DataFrame中,指定CaseClass,转换为Dataset scala> val empDF = spark.read.json("/datas/resources/employees.json...") 方式二:以文本文件方式加载,然后使用函数(get_json_object)提取JSON中字段值 val dataset = spark.read.textFile("") dataset.select
Spark SQL 的DataFrame接口支持操作多种数据源. 一个 DataFrame类型的对象可以像 RDD 那样操作(比如各种转换), 也可以用来创建临时表. ...通用加载和保存函数 1.1 保存到HDFS上 1.1.1 通用写法 df.write.format("json").save("路径") 1.定义一个DF // 把scala集合转换成DF,隐式转换不需要自己导...API读取数据 2.1 加载JSON 文件 Spark SQL 能够自动推测 JSON数据集的结构,并将它加载为一个Dataset[Row]. ...Parquet 格式经常在 Hadoop 生态圈中被使用,它也支持 Spark SQL 的全部数据类型。Spark SQL 提供了直接读取和存储 Parquet 格式文件的方法 1....注意: Parquet格式的文件是 Spark 默认格式的数据源.所以, 当使用通用的方式时可以直接保存和读取.而不需要使用format spark.sql.sources.default 这个配置可以修改默认数据源
3、Spark SQL 可以执行 SQL 语句,也可以执行 HQL 语句,将运行的结果作为 Dataset 和 DataFrame(将查询出来的结果转换成 RDD,类似于 hive 将 sql 语句转换成...都使用了 catalyst 进行 SQL 的优化。可以使得不太会使用 RDD 的工程师写出相对高效的代码。 7、RDD 和 DataFrame 和 DataSet 之间可以进行数据转换。...2、你可以通过 Spark 提供的方法读取 JSON 文件,将 JSON 文件转换成 DataFrame。...示例代码如下: scala> val df = spark.read.json("examples/src/main/resources/people.json") df: org.apache.spark.sql.DataFrame...// 设定之间值类型的编码器,要转换成 case 类 // Encoders.product 是进行 scala 元组和 case 类转换的编码器 override def bufferEncoder
DataFrame API 可在 Scala、Java、Python 和 R 中使用。在 Scala 和 Java 中,DataFrame 由一个元素为 Row 的 Dataset 表示。...在本文剩余篇幅中,会经常使用 DataFrame 来代指 Scala/Java 元素为 Row 的 Dataset。...使用反射来推断模式 Spark SQL 的 Scala 接口支持将元素类型为 case class 的 RDD 自动转为 DataFrame。case class 定义了表的模式。...),那么可以通过以下三步来创建 DataFrame: 将原始 RDD 转换为 Row RDD 根据步骤1中的 Row 的结构创建对应的 StructType 模式 通过 SparkSession 提供的...row,更大的值有助于提升内存使用率和压缩率,但要注意避免 OOMs 其他配置项 调整以下选项也能改善查询性能,由于一些优化可能会在以后的版本中自动化,所以以下选项可能会在以后被弃用 选项名 默认值
使用 DataFrame 进行编程 Spark SQL 的 DataFrame API 允许我们使用 DataFrame 而不用必须去注册临时表或者生成 SQL 表达式. ...读取json文件创建DataFrame // 读取 json 文件 scala> val df = spark.read.json("file:///opt/module/spark/examples/...DSL 语法风格(了解) DataFrame提供一个特定领域语言(domain-specific language, DSL)去管理结构化的数据....可以在 Scala, Java, Python 和 R 中使用 DSL 使用 DSL 语法风格不必去创建临时视图了. 1....从 DataFrame到RDD 直接调用DataFrame的rdd方法就完成了从转换. scala> val df = spark.read.json("/opt/module/spark-local/
命令行 Row 表示每行数据,如何获取各个列的值 RDD如何转换为DataFrame - 反射推断 - 自定义Schema 调用toDF函数,创建DataFrame 2、数据分析(案例讲解...使得Spark SQL得以洞察更多的结构信息,从而对藏于DataFrame背后的数据源以及作用于DataFrame之上的变换进行针对性的优化,最终达到大幅提升运行时效率 DataFrame有如下特性...scala> val empDF = spark.read.json("/datas/resources/employees.json") empDF: org.apache.spark.sql.DataFrame...如何获取Row中每个字段的值呢???? 方式一:下标获取,从0开始,类似数组下标获取 方式二:指定下标,知道类型 方式三:通过As转换类型, 此种方式开发中使用最多 如何创建Row对象呢???...} 09-[掌握]-toDF函数指定列名称转换为DataFrame SparkSQL中提供一个函数:toDF,通过指定列名称,将数据类型为元组的RDD或Seq转换为DataFrame,实际开发中也常常使用
具体而言需要可以执行以下操作: 过滤,转换和清理数据 转化为更高效的存储格式,如JSON(易于阅读)转换为Parquet(查询高效) 数据按重要列来分区(更高效查询) 传统上,ETL定期执行批处理任务...Dataframe,可理解为无限表格 [cloudtrail-unbounded-tables.png] 转化为Dataframe我们可以很方便地使用Spark SQL查询一些复杂的结构 val cloudtrailEvents...如何使用Spark SQL轻松使用它们 如何为用例选择正确的最终格式 2.1 数据源与格式 [blog-illustration-01.png] 结构化数据 结构化数据源可提供有效的存储和性能。...2.2 Spark SQL转数据格式 Spark SQL支持以Parquet,ORC,JSON,CSV和文本格式读取和写入数据,并且Spark包中还存在大量其他连接器,还可以使用JDBC DataSource...例如: 嵌套所有列: 星号(*)可用于包含嵌套结构中的所有列。
,Row表示每行数据,抽象的,并不知道每行Row数据有多少列,弱类型 案例演示,spark-shell命令行 Row 表示每行数据,如何获取各个列的值 RDD如何转换为DataFrame -...使得Spark SQL得以洞察更多的结构信息,从而对藏于DataFrame背后的数据源以及作用于DataFrame之上的变换进行针对性的优化,最终达到大幅提升运行时效率 DataFrame有如下特性...scala> val empDF = spark.read.json("/datas/resources/employees.json") empDF: org.apache.spark.sql.DataFrame...如何获取Row中每个字段的值呢???? 方式一:下标获取,从0开始,类似数组下标获取 方式二:指定下标,知道类型 方式三:通过As转换类型, 此种方式开发中使用最多 如何创建Row对象呢???...} 09-[掌握]-toDF函数指定列名称转换为DataFrame SparkSQL中提供一个函数:toDF,通过指定列名称,将数据类型为元组的RDD或Seq转换为DataFrame,实际开发中也常常使用
领取专属 10元无门槛券
手把手带您无忧上云