Aws Athena - 创建外部 table 跳过第一行
Aws Athena - Create external table skipping first row
我正在尝试使用 Aws Athena 使用以下代码在 csv 文件上创建一个外部 table,但是 TBLPROPERTIES ("skip.header.line.count"="1")
行不起作用:它不会跳过第一行 ( header) 的 csv 文件。
CREATE EXTERNAL TABLE mytable
(
colA string,
colB int
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'separatorChar' = ',',
'quoteChar' = '\"',
'escapeChar' = '\'
)
STORED AS TEXTFILE
LOCATION 's3://mybucket/mylocation/'
TBLPROPERTIES (
"skip.header.line.count"="1")
有什么建议吗?
这是一个尚未实现的功能。查看 Abhishek@AWS 的回复 here:
"We are working on it and will report back as soon as we have an
outcome. Sorry for this again. This ended up taking longer than what
we anticipated."
我的解决方法是在创建 table:
之前预处理数据
- 从 S3 下载 csv 文件
- 使用 bash
sed -e 1d -e 's/\"//g' file.csv > file-2.csv
删除 header
- 将结果上传到 S3 上自己的文件夹中
- 创建 table
刚刚尝试了 "skip.header.line.count"="1"
,现在似乎工作正常。
我最近尝试过:
TBLPROPERTIES ('skip.header.line.count'='1')
现在可以正常使用了。当我将 header 列作为字符串(时间戳)和包含实际时间戳的记录时,出现了这个问题。我的查询会爆炸,因为它会扫描 table 并找到一个字符串而不是 timestamp
。
像这样:
ts
2015-06-14 14:45:19.537
2015-06-14 14:50:20.546
当提出这个问题时,不支持跳过 headers,而当 was later introduced it was only for the OpenCSVSerDe, not for LazySimpleSerDe 时,这就是您指定 ROW FORMAT DELIMITED FIELDS …
时得到的结果。我认为这就是导致人们对该问题的答案是否有效感到困惑的原因。
在 AWS 控制台上,您可以将其指定为 Serde 参数键值对
虽然如果您将基础设施作为代码与 terraform 一起应用,您可以使用 ser_de_info 参数 - "skip.header.line.count" = 1.示例如下
resource "aws_glue_catalog_table" "banana_datalake_table" {
name = "mapping"
database_name = "banana_datalake"
table_type = "EXTERNAL_TABLE"
owner = "owner"
storage_descriptor {
location = "s3://banana_bucket/"
input_format = "org.apache.hadoop.mapred.TextInputFormat"
output_format = "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
compressed = "false"
number_of_buckets = -1
ser_de_info {
name = "SerDeCsv"
serialization_library = "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe"
parameters {
"field.delim" = ","
"skip.header.line.count" = 1 # Skip file headers
}
}
columns {
name = "column_1"
type = "string"
}
columns {
name = "column_2"
type = "string"
}
columns {
name = "column_3"
type = "string"
}
}
}
我正在尝试使用 Aws Athena 使用以下代码在 csv 文件上创建一个外部 table,但是 TBLPROPERTIES ("skip.header.line.count"="1")
行不起作用:它不会跳过第一行 ( header) 的 csv 文件。
CREATE EXTERNAL TABLE mytable
(
colA string,
colB int
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'separatorChar' = ',',
'quoteChar' = '\"',
'escapeChar' = '\'
)
STORED AS TEXTFILE
LOCATION 's3://mybucket/mylocation/'
TBLPROPERTIES (
"skip.header.line.count"="1")
有什么建议吗?
这是一个尚未实现的功能。查看 Abhishek@AWS 的回复 here:
"We are working on it and will report back as soon as we have an outcome. Sorry for this again. This ended up taking longer than what we anticipated."
我的解决方法是在创建 table:
之前预处理数据- 从 S3 下载 csv 文件
- 使用 bash
sed -e 1d -e 's/\"//g' file.csv > file-2.csv
删除 header
- 将结果上传到 S3 上自己的文件夹中
- 创建 table
刚刚尝试了 "skip.header.line.count"="1"
,现在似乎工作正常。
我最近尝试过:
TBLPROPERTIES ('skip.header.line.count'='1')
现在可以正常使用了。当我将 header 列作为字符串(时间戳)和包含实际时间戳的记录时,出现了这个问题。我的查询会爆炸,因为它会扫描 table 并找到一个字符串而不是 timestamp
。
像这样:
ts
2015-06-14 14:45:19.537
2015-06-14 14:50:20.546
当提出这个问题时,不支持跳过 headers,而当 was later introduced it was only for the OpenCSVSerDe, not for LazySimpleSerDe 时,这就是您指定 ROW FORMAT DELIMITED FIELDS …
时得到的结果。我认为这就是导致人们对该问题的答案是否有效感到困惑的原因。
在 AWS 控制台上,您可以将其指定为 Serde 参数键值对
虽然如果您将基础设施作为代码与 terraform 一起应用,您可以使用 ser_de_info 参数 - "skip.header.line.count" = 1.示例如下
resource "aws_glue_catalog_table" "banana_datalake_table" {
name = "mapping"
database_name = "banana_datalake"
table_type = "EXTERNAL_TABLE"
owner = "owner"
storage_descriptor {
location = "s3://banana_bucket/"
input_format = "org.apache.hadoop.mapred.TextInputFormat"
output_format = "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
compressed = "false"
number_of_buckets = -1
ser_de_info {
name = "SerDeCsv"
serialization_library = "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe"
parameters {
"field.delim" = ","
"skip.header.line.count" = 1 # Skip file headers
}
}
columns {
name = "column_1"
type = "string"
}
columns {
name = "column_2"
type = "string"
}
columns {
name = "column_3"
type = "string"
}
}
}