云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

腾讯云_个人网站建设方案_试用

小七 141 0

sparksql中JSON支持简介

注意:从spark1.3开始,SchemaRDD将被重命名为DataFrame。在这篇博客文章中,我们介绍了sparksql的JSON支持,这是我们在Databricks上开发的一个特性,它使得在Spark中查询和创建JSON数据变得非常容易。随着web和移动应用的普及,JSON已经成为web服务API以及长期存储的事实上的交换格式。使用现有的工具,用户常常设计复杂的管道来读写分析系统中的JSON数据集。Spark SQL的JSON支持在ApacheSpark1.1中发布,在ApacheSpark1.2中得到了增强,极大地简化了处理JSON数据的端到端体验。现行做法在实践中,用户在使用现代分析系统处理JSON数据时经常遇到困难。要将数据集写入JSON格式,用户首先需要编写将数据转换为JSON的逻辑。要读取和查询JSON数据集,一种常见的做法是使用ETL管道将JSON记录转换为预定义的结构。在这种情况下,用户必须等待这个过程完成,然后才能使用他们的数据。对于写和读,定义和维护模式定义通常会使ETL任务更加繁重,并消除半结构化JSON格式的许多好处。如果用户想要使用新的数据,他们要么在创建外部表时费力地定义模式,然后使用自定义的JSON序列化/反序列化库,要么使用JSON udf的组合来查询数据。作为一个示例,考虑具有以下JSON架构的数据集:{"name":"Yin","address":{"city":"Columbus","state":"俄亥俄"}{"name":"Michael","address":{"city":空,"state":"California"}}在像Hive这样的系统中,JSON对象通常存储为单个列的值。为了访问这些数据,JSON对象中的字段是使用UDF提取和展平的。在下面显示的SQL查询中,将提取外部字段(名称和地址),然后进一步提取嵌套地址字段。在下面的示例中,假设上面显示的JSON数据集存储在名为people的表中,JSON对象存储在名为jsonObject的列中。选择v1.名称,v2.城市,v2.州从人们那里横向视图json元组(people.json对象,'姓名','地址')v1作为姓名、地址横向视图json元组(v1.address,'city','state')v2作为城市、州;Spark SQL中的JSON支持sparksql为查询JSON数据提供了一种自然语法,并为读写数据自动推断JSON模式。sparksql理解JSON数据中的嵌套字段,并允许用户直接访问这些字段,而无需任何显式转换。Spark SQL中的上述查询如下:选择姓名、年龄,地址.城市, 地址.州从人们那里在sparksql中加载和保存JSON数据集要在sparksql中查询JSON数据集,只需要将sparksql指向数据的位置。数据集的模式是推断出来的,并且在没有任何用户规范的情况下本机可用。在编程api中,可以通过SQLContext提供的jsonFile和jsonRDD方法来完成。使用这两种方法,可以为给定的JSON数据集创建schemadd,然后将schemadd注册为表。下面是一个例子://创建一个SQLContext(sc是一个现有的SparkContext)val sqlContext=新建org.apache.spark网站.sql.SQLContext(sc)//假设您有一个名为people的文本文件,其中包含以下内容://{"name":"Yin","address":{"city":"Columbus","state":"俄亥俄"}//{"name":"Michael","address":{"city":空,"state":"California"}}//为JSON数据集创建schemadd。val人=sqlContext.jsonFile文件("[归档人的路径]")//将创建的schemadd注册为临时表。people.Register可清空("人")还可以使用纯sqlapi创建JSON数据集。例如,对于通过JDBC服务器连接到Spark SQL的用户,可以使用:创建临时表用户使用org.apache.spark网站.sql.json文件选项(路径"[JSON数据集的路径]")在上面的例子中,由于没有提供模式,Spark SQL将通过扫描JSON数据集自动推断出该模式。当字段是JSON对象或数组时,Spark SQL将使用STRUCT type和array type来表示该字段的类型。由于JSON是半结构化的,不同的元素可能有不同的模式,sparksql还将解决字段数据类型的冲突。为了理解JSON数据集的模式是什么,用户可以通过在编程API中使用返回的schemadd提供的printSchema()方法或在SQL中使用DESCRIBE[table name]来可视化该模式。例如,通过人.printSchema()将是:根|--地址:struct(null=true)||——城市:字符串(可为null=true)||——状态:字符串(可空=true)|--名称:字符串(可为null=true)或者,用户可以在使用jsonFile和jsonRDD创建表时将模式应用于JSON数据集。在这种情况下,Spark SQL将把提供的模式绑定到JSON数据集,而不会推断该模式。用户不需要知道JSON数据集中出现的所有字段。指定的架构可以是数据集中出现的字段的子集,也可以具有不存在的字段。在创建了表示JSON数据集的表之后,用户可以像在常规表上一样轻松地在JSON数据集中编写SQL查询。与sparksql中的所有查询一样,查询的结果由另一个schemadd表示。例如:值名称和地址=sqlContext.sql("选择名称,地址.城市, 地址.州来自人民")名称和地址.collect.foreach(印刷品)SQL查询的结果可以直接和立即用于其他数据分析任务,例如机器学习管道。此外,JSON数据集可以很容易地缓存在sparksql内置的内存列存储中,并以其他格式保存,如Parquet或Avro。将SchemaRDDs保存为JSON文件在sparksql中,SchemaRDDs可以通过toJSON方法以JSON格式输出。因为schemadd总是包含一个模式(包括对嵌套和复杂类型的支持),Spark SQL可以自动将数据集转换为JSON,而不需要用户定义格式。SchemaRDDs本身可以从许多类型的数据源创建,包括Apache配置单元表、Parquet文件、JDBC、Avro文件,或者作为对现有schemards的查询的结果。这种组合意味着用户可以将数据迁移到JSON格式,而不必考虑数据源的来源。下一步是什么?随着sparksql对半结构化JSON数据的支持的进一步改进,管道中还有几个特性。改进了对读/写JSON数据集的sqlapi支持在apachespark1.3中,我们将基于新的数据源API引入改进的JSON支持,以便使用SQL读写各种格式。用户可以从JSON数据集创建一个表,该数据集具有一个可选的定义模式,就像他们可以使用jsonFile和jsonRDD一样。此外,用户可以创建一个表,并要求sparksql将其行存储在JSON对象中。数据可以通过SQL插入到这个表中。最后,createtableasselect语句可以用来创建这样的表并填充其数据。处理具有大量字段的JSON数据集JSON数据通常是半结构化的,并不总是遵循固定的模式。将来,我们将扩展sparksql的JSON支持,以处理数据集中的每个对象可能具有相当不同的模式的情况。例如,考虑一个数据集,其中JSON字段用于保存表示HTTP头的键/值对。每个记录可能会引入新类型的头,并且为每个记录使用不同的列将产生非常广泛的模式。我们计划支持自动检测这种情况,而不是使用映射类型。因此,查询的每一行都可能包含一个键/一对的值。这样,sparksql将处理结构少得多的JSON数据集,从而为基于SQL的系统能够处理的查询类型划分了界限。要尝试这些新的Spark特性,可以免费试用Databricks或使用communityedition。免费试用Databricks。今天就开始吧