将CSV Serde与Hive create table一起使用可将所有字段类型转换为字符串

awh*_*han 6 csv hadoop hive opencsv hiveql

如果我创建表并指定CSVSerde,则所有字段都将转换为字符串类型.

hive> create table foo(a int, b double, c string) row format serde 'com.bizo.hive.serde.csv.CSVSerde' stored as textfile; OK Time taken: 0.22 seconds hive> describe foo; OK a string from deserializer b string from deserializer c string from deserializer Time taken: 0.063 seconds, Fetched: 3 row(s) Serde来自https://github.com/ogrodnek/csv-serde

如果我从这个页面https://cwiki.apache.org/confluence/display/Hive/CSV+Serde尝试serde'org.apache.hadoop.hive.serde2.OpenCSVSerde',我看到了同样的事情.所有字段都将更改为字符串类型.

Hive版本1.2.1 Hadoop版本2.7.0 java版本"1.7.0_80"

inv*_*ell 4

是的 com.bizo.hive.serde.csv.CSVSerde 仅创建字符串。这就是它的构建方式以及它将始终如何工作。没有选项可以更改它。我认为这可能适用于您的大多数变量。话虽如此,我会的。

使用基于正则表达式的列规范的 SELECT 语句,该语句可以在 0.13.0 之前的 Hive 版本中使用,如果配置属性 hive.support.quoted.identifiers 设置为 none,则可以在 0.13.0 及更高版本中使用。这意味着您可以快速构建一个新表,将需要的几个变量的类型更改为双精度或整数。

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
Run Code Online (Sandbox Code Playgroud)

;

您可以使用此方法仅触及需要更改的变量并最大限度地减少查询长度。您可以在表顶部创建视图以通过这种方式进行查询。或者您可以创建一个外部表并删除旧表;