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'
)
我在 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 specifyROW 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'
)