我正在使用来自java代码的AWS athena解析csv文件。 csv中的某些列具有日期类型,并且一列中的值包含逗号。
如果使用
创建了athena表 if(x == NULL) {
cout << "Value not in tree." << endl;
return x;
}
if(x->key == key) {
return x;
}
...
然后它无法正确解析列
但是,如果我使用
,它会正确解析 ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
但是ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
的问题是它要求所有列都是字符串数据类型,我需要在查询中执行日期操作,所以不能使用OpenCSVSerde
。
还有其他解决方案吗? 请帮忙!
答案 0 :(得分:3)
这两个SerDes是如何设计的,在数据相对干净的情况下,你应该只使用LazySimpleSerDe
,例如,它没有用引号括起来的值或没有分隔符在价值中。并且OpenCSVSerde
适用于反序列化用引号括起来的值的CSV文件;但是,表中的所有列都是STRING数据类型。更多信息here
因此,在您的情况下,由于您的数据不干净,解析它并加载到Athena的唯一方法是使用OpenCSVSerde
。如果您需要使用日期操作,则需要手动将日期字符串转换/解析为日期对象,这对于date_parse
函数来说相当容易。
如果您在日期类型列中有以下字符串数据,请说明:
11/13/2017
11/14/2017
11/15/2017
11/16/2017
您可以使用以下查询选择范围
中的日期select * from somedb.sometable where date_parse(createdate, '%m/%d/%Y') between DATE'2017-11-14' and DATE'2017-11-16';