hadoop - 使用 Hive 从文件中收集数据

标签 hadoop load hive create-table

我有这种格式的数据。

"123";"mybook1";"2002";"publisher1";
"456";"mybook2;the best seller";"2004";"publisher2";
"789";"mybook3";"2002";"publisher1";

字段包含在 ""中并由 ; 分隔 书名也可能包含“;”介于两者之间。

你能告诉我如何将这些数据从文件加载到配置单元表吗

我现在使用的以下查询显然不起作用;

create table books (isbn string,title string,year string,publisher string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\;'

如果可能的话,我希望将 userid 和 year 字段存储为 Int。 请帮忙

谢谢, 哈里什

最佳答案

您缺少的是 RegexSerDe。这对于仅从输入中插入一部分文本非常有帮助。你的 DDL 是这样的:

create table books ( isbn string, title string, year string, publisher string ) 
  ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
  WITH SERDEPROPERTIES  (
     "input.regex" = "(?:\")(\\d*)(?:\"\;\")([^\"]*)(?:\"\;\")(\\d*)(?:\"\;\")([^\"]*)\"(?:\;)" ,
     "output.format.string" = "%1$s %2$s %3$s %4$s"
    )
  STORED AS TEXTFILE;

由于转义组和非捕获组,正则表达式乍一看可能看起来很复杂。实际上它包含 2 组 (\d*) & ([^"]*) 交替放置两次。非捕获组 ((?:) 只是帮助删除不必要的上下文。([^"]*) 组还处理 bookName 字段中的 ';'。

但没有任何事情是没有代价的。尽管具有所有功能,RegexSerDe 仅支持字符串字段。您所能做的就是在从表中选择数据时调用默认的配置单元 UDF cast 来进行转换。例如(实际语法可能会有所不同):

 SELECT cast( year as int ) from books;

希望这对您有所帮助。

关于hadoop - 使用 Hive 从文件中收集数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26580051/

相关文章:

hadoop - Hadoop安装问题Ubuntu 18.04:hadoop namenode -format错误

performance - Spark 最近 30 天过滤器,提高性能的最佳方法

apache-spark - Hadoop:Spark作业无法处理小型数据集

jquery ajax加载链接问题

hadoop - 通过 Hive 将数据从 HDFS 索引到 Elasticsearch

sql - 从 SQL 中的数组中删除空值

Hadoop 似乎在对给定 reduce 调用的值进行迭代期间修改了我的关键对象

jQuery:加载方法 - 重新加载没有 url 的页面的特定部分?

php - iFrame 中的 CSS : it shows CSS code instead of loading and applying it

apache-spark - 为什么Spark saveAsTable 和bucketBy 创建了数千个文件?