AWS 雅典娜。不能使用 CSV 清单作为位置
AWS Athena. Can't use CSV manifest as a location
我正在尝试在 Athena 中创建一个外部 table,问题是 s3 存储桶在同一文件夹中有不同的文件,所以我无法使用该文件夹作为位置。
我无法修改 s3 文件的路径,但我有一个 CSV 清单,我试图将其用作一个位置,但 Athena 不允许我这样做。
CREATE EXTERNAL TABLE `my_DB`.`my_external_table`(
column1 string,
column2 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'separatorChar' = ',',
'quoteChar' = '\"',
'escapeChar' = '\'
)
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://mys3bucket/tables/my_table.csvmanifest'
TBLPROPERTIES (
'has_encrypted_data'='false',
'skip.header.line.count'='1')
有什么想法可以使用我的清单吗?或者没有雅典娜的另一种方法来解决这个问题?使用 Athena 的目的是避免从 CSV 中获取所有数据,因为我只需要很少的记录
您需要对 CREATE TABLE
语句进行一些更改:
- 使用
'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
作为您的 INPUTFORMAT
- 确保您使用
LOCATION
语句指向一个文件夹
所以你的陈述看起来像:
CREATE EXTERNAL TABLE `my_DB`.`my_external_table`(
column1 string,
column2 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'separatorChar' = ',',
'quoteChar' = '\"',
'escapeChar' = '\'
)
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://mys3bucket/tables/my_table/'
并且 s3://mys3bucket/tables/my_table/
将在其中包含一个文件,其中包含您要查询的 CSV 文件的 S3 路径 - 每行一个路径。我不确定 skip.header.line.count
设置是否对清单文件本身或 CSV 文件起作用,因此您必须进行测试。
或者,如果您的文件数量有限,您可以使用 S3 Select 查询这些文件中的特定列,一次一个。使用 AWS CLI,提取第二列的命令类似于:
aws s3api select-object-content \
--bucket mys3bucket \
--key path/to/your.csv.gz \
--expression "select _2 from s3object limit 100" \
--expression-type SQL \
--input-serialization '{"CSV": {}, "CompressionType": "GZIP"}' \
--output-serialization '{"CSV":{}}' \
sample.csv
(免责声明:AWS 员工)
我正在尝试在 Athena 中创建一个外部 table,问题是 s3 存储桶在同一文件夹中有不同的文件,所以我无法使用该文件夹作为位置。
我无法修改 s3 文件的路径,但我有一个 CSV 清单,我试图将其用作一个位置,但 Athena 不允许我这样做。
CREATE EXTERNAL TABLE `my_DB`.`my_external_table`(
column1 string,
column2 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'separatorChar' = ',',
'quoteChar' = '\"',
'escapeChar' = '\'
)
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://mys3bucket/tables/my_table.csvmanifest'
TBLPROPERTIES (
'has_encrypted_data'='false',
'skip.header.line.count'='1')
有什么想法可以使用我的清单吗?或者没有雅典娜的另一种方法来解决这个问题?使用 Athena 的目的是避免从 CSV 中获取所有数据,因为我只需要很少的记录
您需要对 CREATE TABLE
语句进行一些更改:
- 使用
'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
作为您的INPUTFORMAT
- 确保您使用
LOCATION
语句指向一个文件夹
所以你的陈述看起来像:
CREATE EXTERNAL TABLE `my_DB`.`my_external_table`(
column1 string,
column2 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'separatorChar' = ',',
'quoteChar' = '\"',
'escapeChar' = '\'
)
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://mys3bucket/tables/my_table/'
并且 s3://mys3bucket/tables/my_table/
将在其中包含一个文件,其中包含您要查询的 CSV 文件的 S3 路径 - 每行一个路径。我不确定 skip.header.line.count
设置是否对清单文件本身或 CSV 文件起作用,因此您必须进行测试。
或者,如果您的文件数量有限,您可以使用 S3 Select 查询这些文件中的特定列,一次一个。使用 AWS CLI,提取第二列的命令类似于:
aws s3api select-object-content \
--bucket mys3bucket \
--key path/to/your.csv.gz \
--expression "select _2 from s3object limit 100" \
--expression-type SQL \
--input-serialization '{"CSV": {}, "CompressionType": "GZIP"}' \
--output-serialization '{"CSV":{}}' \
sample.csv
(免责声明:AWS 员工)