我有这种格式的数据。
"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/