【问题标题】:Hive table delimited by comma and multiple spaces由逗号和多个空格分隔的 Hive 表
【发布时间】:2017-07-27 08:33:53
【问题描述】:

我有一个类似的问题: Hive table source delimited by multiple spaces

我的数据如下所示:

AL, 01, 2016010700,   , BEST,   0, 266N,  753W
AL, 01, 2016010706,   , BEST,   0, 276N,  747W
AL, 01, 2016010712,   , BEST,   0, 287N,  738W
AL, 01, 2016010712,   , BEST,   0, 287N,  738W

这意味着我的列分隔符是“逗号加上可变数量的空格”。

我试图通过将此逗号添加到正则表达式来简单地修改field.delim,但它不起作用。 结果是,所有数据都被放入第一列 (basin),而所有其他列都为 NULL。

CREATE EXTERNAL TABLE IF NOT EXISTS default.myTable1
(
   basin string
  ,cy string
  ,yyyymmddhh int
  ,technum_min string
  ,tech string
  ,tau string
  ,lat_n_s string
  ,lon_e_w string 
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe' 
WITH SERDEPROPERTIES ("field.delim"=",\\s+")
LOCATION '/data';

我正在运行 HDP 2.5 (Hive 1.2.1)。

感谢您的任何帮助和建议。

【问题讨论】:

    标签: hadoop hive hive-serde


    【解决方案1】:

    我们有两种方法可以解决您的问题。 使用以下选项创建表'rawTbl'

    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

    并使用 trim() 删除空格

    Insert into baseTbl select trim(basin), trim(cy),...., from rawTbl
    

    或者你可以使用正则表达式

    我已经用正则表达式更新了答案,它将由请求字段组成的文本输入文件分开。正则表达式包含 7 个正则表达式组,每行捕获请求的字段。

    CREATE EXTERNAL TABlE tableex(basin string
      ,cy string
      ,yyyymmddhh int
      ,technum_min string
      ,tech string
      ,tau string
      ,lat_n_s string
      ,lon_e_w string ) 
    ROW FORMAT 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
    WITH SERDEPROPERTIES (
      "input.regex" = '^([A-Za-z]{2}),\s+(\d{2}),\s(\d{10}),\s+,\s([A-Z]{4}),\s+(\d{1}),\s+(\d{3}[A-Z]{1}),\s+(\d+[A-Z]{1})'
    )
    LOCATION '/data';
    

    【讨论】:

    • input.regex 定义列的表达式,而不是分隔符。
    • 是的,这就是为什么我想尝试MultiDelimitSerDe,正如链接的问题所示。不幸的是,使用RegexSerDe 不起作用:ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' WITH SERDEPROPERTIES ("input.regex" = ",\s+") 我还尝试使用双反斜杠:“,\\s+”。它总是给我所有具有 NULL 值的列。
    • 嗨 :-) 更好,但我会使用 \s*(\S*?), 之类的东西而不是固定长度
    • 我有一个解决方法:(1)使用 ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 创建表(2)插入 baseTbl 选择 trim(basin), trim(cy),....,来自 rawTbl
    • 我对此表示赞同,但仅限于解决方案的第一部分。如果我收到第二个并且不得不更新或排除故障,我会非常难过。
    【解决方案2】:

    这个怎么样

    (\S+),\s+(\S+),\s(\S+),\s+,\s(\S+)\s+(\S+),\s+(\S+),\s+(\S*)
    

    【讨论】:

    • 嗯,它一个答案,但它需要一些解释。纯代码答案的价值非常有限。
    猜你喜欢
    • 2012-03-23
    • 2019-03-07
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多