首页 理论教育 JSON数据集操作的案例与解析

JSON数据集操作的案例与解析

时间:2023-06-25 理论教育 版权反馈
【摘要】:Spark SQL可以自动推导出一个JSON数据集的schema并加载它来构建一个DataFrame。这种转换可以通过SQLContext的以下两种方法之一来实现。1)jsonFile:可以从一个JSON文件的目录加载数据,文件中的每一行都对应一个JSON对象。2)jsonRDD:可以从一个现有的RDD实例中加载数据,RDD中的每一个元素都是包含一个JSON对象的字符串。每一行必须包含一个单独的、有效的JSON对象。因此,普通的多行JSON文件通常会失败。查询当前的“spark.sql.dialect”值即可获取使用的具体查询解析器名称。

JSON数据集操作的案例与解析

Spark SQL可以自动推导出一个JSON数据集的schema并加载它来构建一个DataFrame。这种转换可以通过SQLContext的以下两种方法之一来实现。

1)jsonFile:可以从一个JSON文件的目录加载数据,文件中的每一行都对应一个JSON对象。

2)jsonRDD:可以从一个现有的RDD实例中加载数据,RDD中的每一个元素都是包含一个JSON对象的字符串。

注意:作为jsonFile的文件不是一个典型的JSON文件。每一行必须包含一个单独的、有效的JSON对象。因此,普通的多行JSON文件通常会失败。

通过jsonFile加载文件构建DataFrame的示例:

示例中加载people.json这个文件构建出people,并通过printSchema方法打印出people的自动推导出的schema信息,同时,将people注册为临时表“people”,然后通过sql方法用SQL查询语句从“people”临时表中查找年龄在指定范围的名字信息。

通过现有RDD构建DataFrame的示例:

示例中,通过“"""{"name":"Yin","address":{"city":"Columbus","state":"Ohi- o"}}"""::Nil”构建Scala数据集,类型为List[String]。其中字符串“"""{"name":"Yin","address":{"city":"Columbus","state":"Ohio"}}"""”是json格式,包含两个成员“name”和“address”,其中“address”又由一个数据结构组成,包含“city”和“state”两个成员。

通过SparkContext的parallelize方法从List[String]构建出RDD后,再通过SQLContext的jsonRDD方法将RDD实例转换为DataFrame实例。通过printSchema可以看到构建时自动推导出的schema。(www.xing528.com)

注册临时表,然后使用sql进行统计:

对临时表的sql操作,根据name进行group by,以address.city统计个数进行order by,然后获取name和address.city统计个数信息,构建新的DataFrame。

Spark SQL通过Spark.sql.dialect这个配置属性,来设置Spark SQL使用哪种解析器来解析查询的SQL语句,可以通过SQLContext实例的setConf方法或在sql方法中使用一个“SET key=value”命令来设置该配置属性,对于SQLContext,仅支持取值为“sql”的dialect,Spark SQL使用取值为“sql”的dialect来提供简单的SQL解析器。而对于HiveContext,默认使用的dialect取值为“hiveql”,同时dialect的取值为“sql”也是支持的。由于HiveQL解析器是更完整的,一般建议使用取值为“hiveql”的dialect。

注意:在使用不同的dialect时,注意SQL的语法支持,比如在dialect为“sql”时,不要使用保留字来命名,如:

这里使用count这个保留字作为别名,从而导致了SQL查询解析器语法解析时出错,执行命令失败。修改别名后:

对应的,dialect为“hiveql”时,同样的命令是可以正确执行的:

注意:在使用SQL查询语句时,需要注意使用语句的语法正确性。查询当前的“spark.sql.dialect”值即可获取使用的具体查询解析器名称。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈