greenplum对hdfs文件的支持
greenplum是一个优秀的分布式数据库。其外部表这一特性使其与HDFS有一个好的链接,它与下面将简单介绍一下其对HDFS文件格式的支持。
textFile。
创建外部表的时候指定format 为TEXT。同时需要指定每一行的分隔符用于分割。如下按\t 分割字符串:
CREATE EXTERNAL TABLE ext_device_info (offsetid BIGINT, tdid TEXT) LOCATION ('gphdfs://$GPHDFSHOST$:$GPHDFSPORT$/path/part-*') FORMAT 'TEXT' (DELIMITER E'\t' NULL '') ;
创建了外部表了之后,我们就可以用于普通的sql语句进行查询。
parquet。
parquet是HDFS种常见的一种文件类型。GP外部表支持parquet文件。
使用parquet文件,首先我们需要apache的以下jar包:
- parquet-hadoop-1.7.0.jar
- parquet-common-1.7.0.jar
- parquet-encoding-1.7.0.jar
- parquet-column-1.7.0.jar
- parquet-generator-1.7.0.jar
- parquet-format-2.3.0-incubating.jar
我们需要将这些jar包放在$HADOOP_HOME/share/hadoop/common/lib目录下,这里注意:我们需要在GP数据库的所有节都需要以上jar包,不只是Master节点。
准备好这些jar之后,我们就可以建立外部表指定format为parquet,不需要指定任何分隔符。
对于没有任何嵌套的parquet文件,你不会遇到任何问题,所有的数据都能按照预期正常访问。
那如果遇到了嵌套的parquet文件会怎样呢?比如下面这个简单的示例:
扫描二维码关注公众号,回复: 2840332 查看本文章root |-- a: struct (nullable = true) | |-- a: string (nullable = true) | |-- aName: string (nullable = true) |-- bName: string (nullable = true)
官网是这样说的:When reading Parquet type group, the gphdfs protocol converts the group data into an XML document.也就是说当遇到了上诉a这样的数据,gphdfs协议会将其转换成一个XML类型的数据。
我们这样建表:
CREATE EXTERNAL TABLE public.parquetTest5(a text,bname varchar(20)) LOCATION ('gphdfs://ip:8020/tmp/parquetData2/part-*') FORMAT 'PARQUET';
再查询a字段,我们得到以下结果:
<a type="group"><a anotation="UTF8" type="binary">a100</a><aName anotation="UTF8" type="binary">aName</aName></a> <a type="group"><a anotation="UTF8" type="binary">a101</a><aName anotation="UTF8" type="binary">aName</aName></a>
通过以上的结果,我们可以看到它将原来parquet文件种的嵌套的字段组成了一个xml,这个xml里面给出了嵌套字段名,属性及值。感觉这并不是我们想要的,但是网上也指出会将其转换成一个xml(http://gpdb.docs.pivotal.io/4390/admin_guide/load/topics/g-hdfs-parquet-format.html) ,这边也尝试了其他的方式,都没有成功。并且只有建表时指定该类型是TEXT的时候才成功。
那如果我们的parquet有数组呢?那么对数组的这个字段,我们查询会得到以下的结果:
<a type="group"><list type="repeated"><list type="group"><element anotation="UTF8" type="binary">test1</element></list><list type="group"><element anotation="UTF8" type="binary">test2</element></list></list></a>
avro。
GP外部表同时支持avro的数据格式,由于使用场景较少,这里不做描述,参见:http://gpdb.docs.pivotal.io/4390/admin_guide/load/topics/g-hdfs-avro-format.html