【问题标题】:Collecting data from file using Hive使用 Hive 从文件中收集数据
【发布时间】:2014-12-22 04:31:08
【问题描述】:

我有这种格式的数据。

"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 '\;'

如果可能的话,我希望将用户 ID 和年份字段存储为 Int。 请帮忙

谢谢, 哈里什

【问题讨论】:

    标签: hadoop load hive create-table


    【解决方案1】:

    您缺少的是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;
    

    希望这会有所帮助。

    【讨论】:

    • 非常感谢伙计。这帮助很大
    • 嗨,同样数据的另一个帮助。我如何使用 unix 中的 sed 命令来清理数据并获取输出,而不是使用 java RegexSerde。我试图了解 sed 命令并找到了替换选项。所以我可以删除“双引号。但是我该如何处理额外的 ; 数据中间的分号请帮助问候,Harish
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2011-07-27
    • 1970-01-01
    相关资源
    最近更新 更多