【问题标题】:Hadoop - Defining and working on data with no delimeter , nospace/space between some columnsHadoop - 在没有分隔符的情况下定义和处理数据,某些列之间没有空格/空格
【发布时间】:2014-11-24 09:49:53
【问题描述】:

我是 hadoop 新手,正在尝试在 hive 中导入文件。我使用的源数据在某些列之间没有分隔符。

例子:

0000856214AB25    256 T PL1423AS ......
2563458547CD12   748 S  AK2523YU ... and so on...

我已从大型机中以 txt 格式导入此文件。我的字段具有固定数量的字符第一列(1-10),第二列(11-12),第三列(13-14))

我想要的结果是读取这个原始数据如下:

   1st column - 0000856214
   2nd column - AB
   3rd column - 25 
   4th column - 256
   5th column - T
   6th column - PL
   7th column - 1423AS

如何使用 hive 导入这些数据?

【问题讨论】:

  • 您可以尝试使用RegEx SerDe,它允许您根据正则表达式解析您的列,例如cwiki.apache.org/confluence/display/Hive/…
  • 我是新手。你能帮我举个例子吗?那会很有帮助。谢谢
  • @Palash 更新了解决方案,请检查您的输入。
  • some1 可以帮助我吗?我的最后一个查询yyyyyy。

标签: hadoop mapreduce hive hbase


【解决方案1】:

你可以试试这个吗?

input.txt

0000856214AB25    256 T PL1423AS
2563458547CD12   748 S  AK2523YU

使用正则表达式创建 Hive 表:

hive> CREATE TABLE test_regex(
    >f1 STRING,f2 STRING,
    >f3 STRING,f4 STRING,
    >f5 STRING,f6 STRING,
    >f7 STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
    >WITH SERDEPROPERTIES ("input.regex" = 
    >"([0-9]{10})([A-Z]{2})([0-9]{2})\\s+([0-9]{3})\\s+([A-Z]{1})\\s+([A-Z]{2})([A-Z0-9]{6})",
    >"output.format.string" = "%1$s %2$s %3$s %4$s %5s %6s %7s")
    >STORED AS TEXTFILE;
OK
Time taken: 0.056 seconds

数据加载:

hive> load data local inpath 'input.txt' overwrite into table test_regex;
OK
Time taken: 0.183 seconds

列选择:

hive> select f1,f3,f5,f7 from test_regex;
OK
0000856214  25  T   1423AS
2563458547  12  S   2523YU

hive> select *from test_regex;
OK
0000856214  AB  25  256 T   PL  1423AS
2563458547  CD  12  748 S   AK  2523YU
Time taken: 0.094 seconds

【讨论】:

  • 遵循每个步骤。它显示 NULL 记录。请帮助 pfb hive> select *from test_regex; OK NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL (3 个相同的行之间) NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 所用时间:0.186 秒,获取:11 行
  • 您提到的输入工作正常。可以粘贴所有输入记录吗?
  • m 能够运行 select *from test_regex; bt 在从 test_regex 中选择 f1、f3、f5 时出错;总 MapReduce 作业 = 1 正在启动作业 1 / 1 减少任务数设置为 0,因为没有 reduce 运算符已结束作业 = job_201410831439_0239 错误 作业期间出错,正在获取调试信息... 作业跟踪 URL:masterhost.localdomain:50030/… 检查任务 ID : task_201410181439_0239_m_000002 (and more) from job_201410181439_0239 失败次数最多的任务(4): ----- 任务 ID: task_201410181439_0239_m_000000 请帮助.thnx
  • 嗨西瓦,你能帮我解决上述错误吗?当我尝试在员工表中运行“从员工中选择 card_no”时,它工作正常。这里“select * from test_regex”工作正常,但“select f1 from test_regex”在上面的错误中挣扎。请帮忙解决。提前致谢
  • 你能检查它是否在本地模式下工作吗?运行此命令 然后运行查询。
【解决方案2】:

感谢 Sivasakthi Jayaraman 的解决方案

我找到了解决上一个错误的方法。

  1. 下载jarhive-contrib-0.8.1.jar
    (在我的情况下,我在/usr/lib/hive/lib/ 路径中有hive-contrib-0.12.0-cdh5.0.2.jar。)

  2. ADD JAR /home/user17/hive/hive-contrib-0.8.1.jar
    (在我的情况下 - ADD JAR /usr/lib/hive/lib/hive-contrib-0.12.0-cdh5.0.2.jar

  3. 你会看到它会被添加。

现在,

select f1 from test_regex;

0000856214

2563458547

(如预期)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    相关资源
    最近更新 更多