AWS Athena。不能将CSV清单用作位置

时间:2019-04-09 05:56:14

标签: amazon-web-services csv amazon-s3 manifest amazon-athena

我正在尝试在Athena中创建一个外部表,问题是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中获取所有数据,因为我只需要很少的记录

1 个答案:

答案 0 :(得分:0)

您需要对CREATE TABLE语句进行一些更改:

  1. 使用'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'作为您的INPUTFORMAT
  2. 确保您使用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员工)