我尝试使用Aws Athena在csv文件上创建一个外部表格,但代码如下但行TBLPROPERTIES ("skip.header.line.count"="1")
不起作用:它不会跳过第一行(标题)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")
有任何建议吗?
答案 0 :(得分:17)
刚试过"skip.header.line.count"="1"
,现在似乎工作正常。
答案 1 :(得分:5)
这是一项尚未实施的功能。请参阅Abhishek @ AWS'回复here:
“我们正在努力,并会在我们收到报告后立即报告 结果。对此再次抱歉。最终花费的时间超过了 我们预料到了。“
我的解决方法是在创建表格之前预处理数据:
sed -e 1d -e 's/\"//g' file.csv > file-2.csv
答案 2 :(得分:0)
我最近尝试过:
TBLPROPERTIES ('skip.header.line.count'='1')
现在可以正常工作了。当我将列标题作为字符串(时间戳)和实际时间戳记记录时,就会出现此问题。我的查询会爆炸,因为它会扫描表并找到一个字符串,而不是timestamp
。
类似的东西:
ts
2015-06-14 14:45:19.537
2015-06-14 14:50:20.546
答案 3 :(得分:0)
询问此问题时,不支持跳过标头,当它was later introduced时仅适用于OpenCSVSerDe,而不适用于LazySimpleSerDe,这是您获得的内容指定ROW FORMAT DELIMITED FIELDS …
。我认为这是对它在该问题的答案中是否起作用的困惑。
答案 4 :(得分:0)
在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"
}
}
}