使用 Flex 解析器加载列式表

您可以使用任何 Flex 解析器将数据加载到列式表中。使用 Flex 表解析器加载列式表使您能够在一个表中混合数据加载。例如,您可以将 JSON 数据加载到一个会话中,而将分隔数据加载到另一个会话中。

下面的基本示例说明了您可以如何将 Flex 解析器用于列式表。

  1. 创建一个列式表 super,其具有两列,分别是 agename

    => CREATE TABLE super(age INT, name VARCHAR);
    CREATE TABLE
    
  2. 使用 fjsonparser() 输入来自 STDIN 的 JSON 值。

    => COPY super FROM stdin PARSER fjsonparser();
    Enter data to be copied followed by a newline.
    End with a backslash and a period on a line by itself.
    >> {"age": 5, "name": "Tim"}
    >>  {"age": 3}
    >>  {"name": "Fred"}
    >>  {"name": "Bob", "age": 10}
    >> \.
    
  3. 查询该表以查看您输入的值:

    
    => SELECT * FROM super;
     age | name
    -----+------
         | Fred
      10 | Bob
       5 | Tim
       3 |
    (4 rows)
    
  4. 使用 fdelimitedparser() 输入来自 STDIN 的一些分隔值:

    => COPY super FROM stdin PARSER fdelimitedparser();
    Enter data to be copied followed by a newline.
    End with a backslash and a period on a line by itself.
    >> name |age
    >> Tim|50
    >> |30
    >> Fred|
    >> Bob|100
    >> \.
    
  5. 查询 Flex 表。JSON 和分隔数据均保存在同一个列式表 super 中。

    => SELECT * FROM super;
     age | name
    -----+------
      50 | Tim
      30 |
       3 |
       5 | Tim
     100 | Bob
         | Fred
      10 | Bob
         | Fred
    (8 rows)
    

使用 reject_on_materialized_type_error 参数避免加载类型不匹配的数据。如果 reject_on_materialized_type_error 设置为 false,Flex 解析器将接受类型不匹配的数据。请考虑以下示例:

假定待加载的 CSV 文件具有以下示例内容:

$ cat json.dat
{"created_by":"system","site_source":"flipkart_india_kol","updated_by":"system1","invoice_id":"INVDPKOL100",
"vendor_id":"VEN15731","total_quantity":12,"created_at":"2012-01-09 23:15:52.0"}
{"created_by":"system","site_source":"flipkart_india_kol","updated_by":"system2","invoice_id":"INVDPKOL101",
"vendor_id":"VEN15732","total_quantity":14,"created_at":"hello"}
  1. 创建列式表。

    => CREATE TABLE hdfs_test (
    site_source VARCHAR(200),
    total_quantity int ,
    vendor_id varchar(200),
    invoice_id varchar(200),
    updated_by varchar(200),
    created_by varchar(200),
    created_at timestamp
    );
    
  2. 加载 JSON 数据。

    =>COPY hdfs_test FROM '/home/dbadmin/json.dat' PARSER fjsonparser() ABORT ON ERROR;
    Rows Loaded
    -------------
    2
    (1 row)
    
  3. 查看内容。

    => SELECT * FROM hdfs_test;
    site_source | total_quantity | vendor_id | invoice_id | updated_by | created_by | created_at
    --------------------+----------------+-----------+-------------+------------+------------+---------------------
    flipkart_india_kol | 12 | VEN15731 | INVDPKOL100 | system1 | system | 2012-01-09 23:15:52
    flipkart_india_kol | 14 | VEN15732 | INVDPKOL101 | system2 | system |
    (2 rows)
    
  4. 如果 reject_on_materialized_type_error 参数设置为 true,您将在加载示例 JSON 数据时收到错误消息。

    => COPY hdfs_test FROM '/home/dbadmin/data/flex/json.dat' PARSER fjsonparser(reject_on_materialized_type_error=true) ABORT ON ERROR;
    ERROR 2035:  COPY: Input record 2 has been rejected (Rejected by user-defined parser)