csv external table 的 presto 语法,其中一个字段中有数组

presto syntax for csv external table with array in one of the fields

我在 Athena 中创建 table 时遇到问题 - 它指向具有以下格式的文件: 字符串,字符串,字符串,数组。

当我编写文件时 - 我用“|”分隔数组项。 我用 '\n' 分隔每一行,用 ',' 分隔每一列。

例如,我的 CSV 中的一行看起来像这样:

Garfield, 15, orange, fish|milk|lasagna

在配置单元中(根据我阅读的文档)- 当创建具有行分隔格式的 table 时 - 在声明分隔符时,您可以声明一个 'collection items' 分隔符 - 声明之间的分隔符数组列中的元素。 我在文档中找不到 Presto 的等效项,

有人知道这是否可能吗?如果可能的话 - 格式是什么,或者我在哪里可以找到它?

我尝试了 "guessing" 多种形式,包括 'collection items',none 似乎有效。

CREATE EXTERNAL TABLE `cats`(
  `name` string, 
  `age` string, 
  `color` string, 
  `foods` array<string>)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
  LINES TERMINATED BY '\n' 
  COLLECTION ITEMS TERMINATED BY '|'
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'some-location'

非常感谢任何见解,谢谢! :)

(注意:此答案一般适用于 Presto,但不适用于 Athena)

目前您无法在 Presto 中设置集合分隔符。 请创建一个功能请求@ https://github.com/prestosql/presto/issues/

请注意,我们计划为 table 属性提供通用支持,以全面解决此类问题 -- https://github.com/prestosql/presto/issues/954. You can track the issue and associated pull request 更新。

根据 using SerDe 上的 AWS Athena 文档,您的猜测 100% 正确。

In general, Athena uses the LazySimpleSerDe if you do not specify a ROW FORMAT, or if you specify ROW FORMAT DELIMITED

ROW FORMAT
DELIMITED FIELDS TERMINATED BY ','
ESCAPED BY '\'
COLLECTION ITEMS TERMINATED BY '|'
MAP KEYS TERMINATED BY ':'

现在,当我简单地尝试你的 DDL 语句时,我会得到

line 1:8: no viable alternative at input 'create external'

但是通过删除 LINES TERMINATED BY '\n',我能够在元目录中创建 table 架构

CREATE EXTERNAL TABLE `cats`(
  `name` string, 
  `age` string, 
  `color` string, 
  `foods` array<string>)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
  COLLECTION ITEMS TERMINATED BY '|'
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'some-location'

包含您文件中显示的行的示例文件将得到正确解析,我能够在 foods 列上执行 UNNEST

SELECT * 
FROM "cats" 
CROSS JOIN UNNEST(foods) as t(food)

这导致

此外,简单地交换行 LINES TERMINATED BY '\n'COLLECTION ITEMS TERMINATED BY '|' 也足以使查询工作(尽管我没有解释)

CREATE EXTERNAL TABLE `cats`(
  `name` string, 
  `age` string, 
  `color` string, 
  `foods` array<string>)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ','   
  COLLECTION ITEMS TERMINATED BY '|'
  LINES TERMINATED BY '\n' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'some-location'

我正在使用presto引擎创建一个配置单元table,在Presto中设置集合分隔符,例如:

CREATE TABLE IF NOT EXISTS test (        
       id bigint COMMENT 'ID',                   
       type varchar COMMENT 'TYPE',                   
       content varchar COMMENT 'CONTENT',          
       create_time timestamp(3) COMMENT 'CREATE TIME',          
       pt varchar                                    
)                                                 
COMMENT 'create time 2021/11/04 11:27:53'` 
WITH (                                             
       format = 'TEXTFILE',                            
       partitioned_by = ARRAY['pt'],                   
       textfile_field_separator = U&'[=10=]01'            
)