【问题标题】:Loading data using Hive Sed command使用 Hive Sed 命令加载数据
【发布时间】:2014-11-12 21:42:26
【问题描述】:

我有这种格式的数据。

"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。请帮忙

我也不想使用 regexserde 命令。 如何使用 unix 中的 sed 命令清理数据并获取输出。

我尝试了解 sed 命令并找到了替换选项。所以我可以删除 " 双引号。但是我该如何处理额外的 ; 数据中间的分号

请帮忙

【问题讨论】:

  • 如果我对源代码的预期结果有所了解(不知道要使用的 hive/hadoop 协议/结构),可以在 sed 中提供帮助。请给出预期结果样本

标签: hadoop sed hive


【解决方案1】:

我认为您可以使用sed 进行预处理,然后使用MetadataTypedColumnsetSerDe WITH SERDEPROPERTIES

sed -r ':a; s/^([^"]*("[^"]*"[^"]*)*);/\1XXXXX/g; t a; s/;/ /g; s/XXXXX/;/g' file

sed 匹配引号对以避免处理引号之间的内容,将分号的占位符放置在引号文本之外。之后,它从书名文本中删除 ; 并用空格替换它们,并放回引号之外的分号。

有关如何使用 Hive 加载数据的更多信息,请参阅此处,包括 MetadataTypedColumnsetSerDe WITH SERDEPROPERTIES 的示例:

https://svn.apache.org/repos/asf/hive/trunk/serde/README.txt

【讨论】:

    【解决方案2】:
    create external table books (isbn int,title string,year int,publisher string)
    
         row format SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH
    
         SERDEPROPERTIES ('separatorChar' = '\;' , 'quoteChar' = '\"' ) location 'S3 
    
        path/HDFS path for the file'; 
    

    【讨论】:

    • 一些格式和解释会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    相关资源
    最近更新 更多