一、加载数据
通过加载parquet数据源,并将加载后的people注册到临时表中,然后使用SQL语句对该临时表进行操作,最后将操作结果打印出来。
如下所示:
二、分区发现
在类似于Hive的系统上,表分区是一种常见的优化方法。在一个分区表中,数据通常存储在不同的目录中,并将分区列值编码到每个分区目录的路径上。现在,Parquet数据源可以自动地发现和推导分区信息。
例如,我们可以添加额外的列“gender”,作为我们的分区列,用以下目录结构,可将DataFrame实践案例中的员工信息数据存储到分区表中。
通过将分区表的路径传递到SQLContext.parquetFile或SQLContext.load,Spark SQL会自动地从路径中提取分区信息。这时候返回的DataFrame的schema就构建成功了。
注意:分区表中用于分区的列的数据类型是自动推导的,目前自动推导支持数字数据类型和字符串类型。(www.xing528.com)
具体的示例可以参考下一部分内容:合并schema。
三、合并schema
与ProtocolBuffer,Avro和Thrift一样,Parquet也支持schema演变,用户可以先使用一个简单的schema,然后根据需要逐步添加更多的列到schema中。通过这种方式,最终可以让多个不同的Parquet在schema上互相兼容。Parquet数据源目前可以自动检测到这种情况,并合并所有这些文件。
以下案例说明了合并schema的详细步骤:
示例中,首先通过SparkContext的makeRDD方法构建一个RDD实例,然后调用RDD实例的toDF方法指定schema,生成DataFrame实例,对应的schema信息为:[single:int,double:int]。然后将该DataFrame实例df1保存到分区路径“data/test_table/key=1”下。
用相同的方法构建DataFrame实例df2,对应的schema为[single:int,triple:int],df2的schema信息比df1添加列“triple”列,同时删除了“double”列,然后保存到分区路径“da-ta/test_table/key=2”下。
最后读取分区表到parquet,其路径为包含“data/test_table/key=1”和“data/test_table/key=2”两个路径的data/test_table路径。加载构建DataFrame实例df3之后,会自动推导出df3的schema信息,最终推导出的schema信息为[single:int,double:int,triple:int,key:int],包含列df1和df2的“single”,“double”和“triple”列信息,以及出现在分区路径上的“key”分区列信息。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。