Parquet概述
Apache Parquet是Hadoop生态系统中任何项目都可以使用的列式存储格式,不受数据处理框架、数据模型和编程语言的影响。Spark SQL支持对Parquet文件的读写,并且可以自动保存源数据的Schema。当写入Parquet文件时,为了提高兼容性,所有列都会自动转换为“可为空”状态。
二、读取和写入Parquet的方法
加载和写入Parquet文件时,除了可以使用load()方法和save()方法外,还可以直接使用Spark SQL内置的parquet()方法
Schema合并概述
与Protocol Buffer、Avro和Thrift一样,Parquet也支持Schema合并。刚开始可以先定义一个简单的Schema,然后根据业务需要逐步向Schema中添加更多的列,最终会产生多个Parquet文件,各个Parquet文件的Schema不同,但是相互兼容。对于这种情况,Spark SQL读取Parquet数据源时可以自动检测并合并所有Parquet文件的Schema。
(二)开启Schema合并功能
由于Schema合并是一个相对耗时的操作,并且在多数情况下不是必需的,因此从Spark 1.5.0开始默认将Schema自动合并功能关闭,可以通过两种方式开启。
读取JSON文件概述
Spark SQL可以自动推断JSON文件的Schema,并将其加载为DataFrame。在加载和写入JSON文件时,除了可以使用load()方法和save()方法外,还可以直接使用Spark SQL内置的json()方法。该方法不仅可以读写JSON文件,还可以将Dataset[String]类型的数据集转为DataFrame。
需要注意的是,要想成功地将一个JSON文件加载为DataFrame,JSON文件的每一行必须包含一个独立有效的JSON对象,而不能将一个JSON对象分散在多行。
Spark SQL支持读写Hive
Spark SQL还支持读取和写入存储在Apache Hive中的数据。然而,由于Hive有大量依赖项,这些依赖项不包括在默认的Spark发行版中,如果在classpath上配置了这些Hive依赖项,Spark就会自动加载它们。需要注意的是,这些Hive依赖项必须出现在所有Worker节点上,因为它们需要访问Hive序列化和反序列化库(SerDes),以便访问存储在Hive中的数据。
在使用Hive时,必须实例化一个支持Hive的SparkSession对象。若系统中没有部署Hive,则仍然可以启用Hive支持(Spark SQL充当Hive查询引擎)。Spark对Hive的支持包括连接到持久化的Hive元数据库、Hive SerDe、Hive用户定义函数、HiveQL等。如果没有配置hive-site.xml文件,Spark应用程序启动时,就会自动在当前目录中创建Derby元数据库metastore_db,并创建一个由spark.sql.warehouse.dir指定的数据仓库目录(若不指定,则默认启动Spark应用程序当前目录中的spark-warehouse目录)。需要注意的是,从Spark2.0.0版本开始,hive-site.xml中的hive.metastore.warehouse.dir属性不再使用了,代替的是使用spark.sql.warehouse.dir指定默认的数据仓库目录。
Spark SQL读取关系数据库
Spark SQL还可以使用JDBC API从其他关系型数据库读取数据,返回的结果仍然是一个DataFrame,可以很容易地在Spark SQL中处理,或者与其他数据源进行连接查询。
二、Spark SQL JDBC连接属性
在使用JDBC连接数据库时可以指定相应的连接属性