greenplum对hdfs文件的支持

greenplum对hdfs文件的支持

greenplum是一个优秀的分布式数据库。其外部表这一特性使其与HDFS有一个好的链接,它与下面将简单介绍一下其对HDFS文件格式的支持。

  1. 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语句进行查询。

  2. 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文件会怎样呢?比如下面这个简单的示例:

    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>
    
  3. avro。
    GP外部表同时支持avro的数据格式,由于使用场景较少,这里不做描述,参见:http://gpdb.docs.pivotal.io/4390/admin_guide/load/topics/g-hdfs-avro-format.html

猜你喜欢

转载自blog.csdn.net/yulin_Hu/article/details/81673318