如果我创建一个表并指定一个 CSVSerde,那么所有字段都将转换为字符串类型。
hive> 创建表 foo(a int, b double, c string) 行格式 serde 'com.bizo.hive.serde.csv.CSVSerde' 存储为文本文件;
好的
耗时:0.22秒
配置单元 > 描述 foo;
好的
来自反序列化器的字符串
b 来自反序列化器的字符串
来自反序列化器的 c 字符串
耗时:0.063 秒,获取:3 行
Serde 来自 https://github.com/ogrodnek/csv-serde
如果我从这个页面尝试 serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde' https://cwiki.apache.org/confluence/display/Hive/CSV+Serde我看到了同样的事情。所有字段都被更改为字符串类型。
hive 版本 1.2.1 Hadoop 版本 2.7.0 Java 版本“1.7.0_80”
最佳答案
是的,com.bizo.hive.serde.csv.CSVSerde 只创建字符串。这就是它的构建方式以及它将始终有效的方式。没有更改它的选项。我认为这很可能适用于您的大多数变量。话虽如此,我会的。
使用使用基于正则表达式的列规范的 SELECT 语句,如果配置属性 hive.support.quoted.identifiers 设置为,则可以在 0.13.0 之前的 Hive 版本或 0.13.0 及更高版本中使用没有任何。这意味着您可以快速构建一个新表,将您需要的少数变量的类型更改为 double 或整数。
set hive.support.quoted.identifiers=none;
drop table if exists database.table_name;
create table if not exists database.table_name as
select `(a|b|c)?+.+`
, cast(a as double) as a
, cast(b as double) as b
, cast(c as double) as c
from database.some_table
;
您可以使用此方法仅触及需要更改的变量并最小化查询长度。您可以在表的顶部创建 View 以这种方式查询。或者您可以创建一个外部表并删除旧表;
关于csv - 使用 CSV Serde 和 Hive 创建表将所有字段类型转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31221012/