3

我有一个用双引号和逗号分隔的 CSV 文件。它看起来有点像下面这样:

“来自供应商的文本”,“供应商名称,Inc.”,“等等等等”,“下一个字符串”,“”,1234

我正在尝试使用 Hive 将其导入 Hbase 中的表中。

我可以使用以下内容在 Hbase 中从 Hive 创建一个表:

hive> CREATE TABLE exampletable1(tax_numb int, tax_name string, tax_addr string, tax_city string, tax_stat string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:tax_name,cf:tax_addr,cf:tax_city,cf:tax_stat")
TBLPROPERTIES ("hbase.table.name" = "hiveexampletable1");

我还能够向 Hive 添加一个表,在该表中我使用以下命令导入了 CSV 文件(尽管双引号存在问题):

hive> create table example2(tax_numb int, tax_name string, tax_addr string, tax_city string, tax_stat string) 以“,”结尾的行格式分隔字段,存储为文本文件;

但是,我无法将“分隔字段”位集成到我在 Hbase 中创建外部表的命令中。

由于我对 Hive-Hbase 组合相对较新,所以在到达我认为最好向社区寻求帮助的地步之前,我阅读了许多教程。我在谷歌上进行了多次搜索,但无济于事。

任何帮助/建议将不胜感激。

4

2 回答 2

1

我使用 org.apache.hadoop.hive.serde2.RegexSerDe 作为 serde 来解析这种文件。例如,如果我有一个包含 4 个字段的 csv,它们是整数、字符串、整数、字符串,我可以使用:

CREATE EXTERNAL TABLE mytable (
    F1 BIGINT, F2 STRING, 
    F2 INT, F4 STRING
)
row format SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
with SERDEPROPERTIES ("input.regex" = "^\"([^\"]*)\",\"([^\"]*)\",\"([^\"]*)\",\"([^\"]*)\"$")
LOCATION "/somepath";

正则表达式 y 总是相同的,所以我用 python 生成它,如下所示:

>>> r = "^" + ",".join(['"([^"]*)"' for i in xrange(0,4)]) + "$"
>>> print str(r).replace('"', '\\"')
^\"([^\"]*)\",\"([^\"]*)\",\"([^\"]*)\",\"([^\"]*)\"$

问候!

于 2014-02-11T16:38:42.810 回答
0

在多次尝试找到一个漂亮的解决方案后,我最终不得不求助于老派并重新使用 awk。我使用的命令看起来像这样:

$ cat inputCSVfile.csv | awk '{print substr ($0, 252, 20) echo "|" substr ($0, 133, 2) 回显“|” substr ($0, 297, 13)}'

这给了我我需要的东西。然后我将数据导入 Hive 并从那里弹出到 Hbase。希望它对将来的人有所帮助。

于 2013-02-28T23:58:44.773 回答