使用 Flex 解析器加载列式表
您可以使用任何 Flex 解析器将数据加载到列式表中。使用 Flex 表解析器加载列式表使您能够在一个表中混合数据加载。例如,您可以将 JSON 数据加载到一个会话中,而将分隔数据加载到另一个会话中。
注意
对于 Avro 数据,您可以只将数据加载到列式表,而不加载架构。对于 Flex 表,则必须将 Avro 架构信息嵌入在数据中。下面的基本示例说明了您可以如何将 Flex 解析器用于列式表。
-
创建一个列式表
super
,其具有两列,分别是age
和name
:=> CREATE TABLE super(age INT, name VARCHAR); CREATE TABLE
-
使用
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} >> \.
-
查询该表以查看您输入的值:
=> SELECT * FROM super; age | name -----+------ | Fred 10 | Bob 5 | Tim 3 | (4 rows)
-
使用
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 >> \.
-
查询 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"}
-
创建列式表。
=> 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 );
-
加载 JSON 数据。
=>COPY hdfs_test FROM '/home/dbadmin/json.dat' PARSER fjsonparser() ABORT ON ERROR; Rows Loaded ------------- 2 (1 row)
-
查看内容。
=> 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)
-
如果
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)