csv - 使用 CSV Serde 和 Hive 创建表将所有字段类型转换为字符串

标签 csv hadoop hive hiveql opencsv

如果我创建一个表并指定一个 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/

相关文章:

google-cloud-platform - 无法在 Dataproc 2.0 镜像中创建 Avro 表

hadoop - 从文件名中提取时间戳,并使用Pig将其添加到新列(例如,日期)中

mongodb - 处理大数据集(neo4j、mongo db、hadoop)

hadoop - 在 HDI Hadoop 集群中启用 SSL

Python + BeautifulSoup 导出到 CSV

database - 如何一次将 101 个 CSV 文件导入我的 PostgreSQL 数据库?

xml - 可视化来自hadoop的xml数据

python - 使用通配符的复杂和自定义 SQL 连接条件

r - 根据字符串匹配删除数据 - R

python - 如何将spark数据输出到具有单独列的csv文件?