在 Hive 中获取空值 使用 REGEX 创建和加载查询

2024-04-19

我有一个日志文件,我需要在其中使用 REGEX 存储数据。我尝试了下面的查询,但加载了所有 NULL 值。我已经检查了 REGEXhttp://www.regexr.com/ http://www.regexr.com/,它对我的​​数据工作正常。

CREATE EXTERNAL TABLE IF NOT EXISTS avl(imei STRING,packet STRING)                        
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (                                             
"input.regex" = "(IMEI\\s\\d{15} (\\b(\\d{15})([A-Z0-9]+)) )",          
"output.format.string" = "%1$s %2$s"                              
)
STORED AS TEXTFILE;

LOAD DATA INPATH 'hdfs:/user/user1/data' OVERWRITE INTO TABLE avl;

请在这里纠正我。

样本日志:

[INFO_|01/31 07:19:29]  IMEI 356307043180842 
[INFO_|01/31 07:19:33]  PacketLength = 372
[INFO_|01/31 07:19:33]  Recv HEXString : 0000000000000168080700000143E5FC86B6002F20BC400C93C6F000FF000E0600280007020101F001040914B34238DD180028CD6B7801C7000000690000000143E5FC633E002F20B3000C93A3B00105000D06002C0007020101F001040915E64238E618002CCD6B7801C7000000640000000143E5FC43FE002F20AA800C9381700109000F06002D0007020101F001040915BF4238D318002DCD6B7801C70000006C0000000143E5FC20D6002F20A1400C935BF00111000D0600270007020101F001040916394238B6180027CD6B7801C70000006D0000000143E5FBF5DE002F2098400C9336500118000B0600260007020101F0010409174D42384D180026CD6B7801C70000006E0000000143E5FBD2B6002F208F400C931140011C000D06002B0007020101F001040915624238C018002BCD6B7801C70000006F0000000143E5FBAF8E002F2085800C92EB10011E000D06002B0007020101F0010409154C4238A318002BCD6B7801C700000067000700005873

Thanks.


根据您当前的表定义,任何正则表达式都无法满足您的要求。原因是你的 file_format 设置为TEXTFILE,按行分割输入文件(\r, \n, or \r\n),在数据到达 SerDe 之前。

然后将每一行单独传递到正则表达式串行器,与您的正则表达式匹配,任何不匹配的返回NULL。因此,多行正则表达式将无法使用STORED AS TEXTFILE。这也是您收到全部的原因NULLrows:因为没有任何一行输入与您的整个正则表达式匹配。

这里的一种解决方案可能是预处理数据,使每条记录仅位于输入文件中的一行,但这不是您所要求的。

在 Hive 中执行此操作的方法是使用不同的 file_format:

STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'

TextInputFormat 从当前配置中读取名为的配置变量文本输入格式.记录.分隔符。如果您正在使用文本输入格式,此变量告诉 Hadoop 和 Hive 一条记录的结束位置和下一条记录的开始位置。

因此,将此值设置为类似EOR意味着输入文件被分割EOR,而不是按行。分割生成的每个块将作为整个块、换行符等传递给 RegexSerDe。

您可以在多个位置设置此变量,但如果这是仅此(以及会话中的后续)查询的分隔符,那么您可以执行以下操作:

SET textinputformat.record.delimiter=EOR;

CREATE EXTERNAL TABLE ...
...
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
   "input.regex" = ...
   "output.regex" = ...
)
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
          OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION ...;

在你的具体场景中,我不知道你可能会用什么textinputformat.record.delimiter代替EOF,因为我们只给出了一个示例记录,并且我无法根据您的正则表达式判断您要尝试捕获第二个字段。

如果您能提供这两项(具有 >1 条记录的示例数据,以及您要捕获的内容packet),也许我能帮上更多忙。就目前情况而言,您的正则表达式与您提供的示例数据不匹配——甚至不匹配您链接的网站 http://regexr.com/3cogg.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Hive 中获取空值 使用 REGEX 创建和加载查询 的相关文章

  • C# 中是否存在异步正则表达式?它们对我的情况有帮助吗?

    我的应用程序使用正则表达式并行搜索许多文件 await Task WhenAll filePaths Select FindThings 代替FindThings 它花费大部分时间执行正则表达式搜索 因为这些文件的大小可能有数百MB sta
  • 匹配所有 utf-8/unicode 小写字母形式的正确正则表达式是什么

    我想匹配all拉丁语块中的小写字母形式 简单的 a z 仅匹配 U 0061 和 U 007A 之间的字符 而不匹配所有其他小写形式 我想匹配所有小写字母 最重要的是 EFIGS 语言中使用的拉丁语块中的所有带重音的小写字母 a z 是一个
  • MVC 模型在 OnExecuted 操作过滤器中为 null ...或者设置模型的更优雅的方式?

    我有一个 ActionFilter 它覆盖了 OnActionExecuted 方法 在 POST 操作中 filterContext Controller ViewData Model 始终为 null 我确实发现下面的文章似乎在说它不应
  • 2017 年在 OS X 上从源代码构建 Apache Hadoop

    到目前为止 我已经分叉了 Git 存储库 https github com apache hadoop 我一直在寻找有关如何从源代码构建的信息 我尝试过以下命令 mvn package Pdist Dtar DskipTests 这导致了以
  • 使用 Regex/C# 将 转换为

    奇怪的问题 但我不会浪费时间解释为什么我需要这样做 只是我需要这样做 我有以下内容
  • Notepad++ RegEx 替换为 Zerofill

    我需要替换这样的列表 105164 25 105164 26 105164 29 105496 1 105496 2 To 105164 0025 105164 0026 105164 0029 105496 0001 105496 000
  • 提取字符串中最后一个句点后的文本[重复]

    这个问题在这里已经有答案了 我意识到这个问题对于大多数正则表达式大师来说可能看起来非常简单 但是回顾类似的问题并没有得出解决方案 我有一个电子邮件地址向量 称为email并希望在每个最后一个句点之后提取文本 举例来说 email lt c
  • 在 Hadoop 中按文件中的值排序

    我有一个文件 其中每行包含一个字符串 然后是一个空格 然后是一个数字 例子 Line1 Word 2 Line2 Word1 8 Line3 Word2 1 我需要按降序对数字进行排序 然后将结果放入文件中 为数字分配排名 所以我的输出应该
  • Groovy 中 Null Object 类的用途是什么?

    我已经使用 Groovy 五个小时了 刚刚发现Groovy NullObject http groovy codehaus org api index html org codehaus groovy runtime NullObject
  • 如何从捆绑 .spec.js 文件中排除 webpack

    我的 Package bundle 读取 var reqContext require context true js reqContext keys map reqContext 其中基本上包括所有 js 文件 我希望表达式排除任何 sp
  • 如何在java中使用模式匹配器?

    假设字符串是我想提取xyz从字符串中出来 我用了 Pattern titlePattern Pattern compile lttitle gt s s lt title gt Matcher titleMatcher titlePatte
  • 为什么 rm 不能按我的预期工作?

    我只想做一件简单的事 我在目录中得到了以下文件 AppInterface h baa PEMsg h PluginInterface h 然后我发出命令 ls grep v h rm rf 令我非常沮丧的是 baa不会被删除 但是这个 ls
  • 正则表达式中 (*) 和 .* 有什么区别? [复制]

    这个问题在这里已经有答案了 是任意字符零次或多次 我试图找到以元音开头的单词 我用了 aeiou 它给了我所有以元音开头的单词 当我这样做时给出相同的结果 aeiou 现在我正在寻找以元音结尾的单词 我做到了 aeiou 它没有给出任何结果
  • C 中的 NULL 是否需要/定义为零?

    在我的 GCC 测试程序中 NULL 似乎为零 但维基百科说NULL只需要指向不可寻址的内存 有编译器做吗NULL非零 我很好奇是否if ptr NULL 是比更好的练习if ptr NULL is guaranteed to be zer
  • 用于正则表达式匹配及其在字符串中的位置的紧凑 Clojure 代码

    斯图尔特 哈洛威举了个例子 re seq w The quick brown fox 作为在 Clojure 中查找正则表达式匹配项的自然方法 在他的书中 这种构造与匹配器上的迭代进行了对比 如果人们关心的只是一份比赛列表 那就太好了 但是
  • 如何用单引号替换双引号

    我该如何更换 我认为这称为双引号 我认为它称为单引号 使用 PHP str replace text 或重新分配它 text str replace text
  • Spark JDBC 仅返回带有列名的数据帧

    我正在尝试使用 Spark JDBC 连接到 HiveTable 代码如下 val df spark read format jdbc option driver org apache hive jdbc HiveDriver option
  • 正则表达式或多个/单个字符

    我正在动态地制作一个正则表达式 我希望它匹配以下内容 lem le m levm lecm 基本上是 lem 但在 m 之前它可以有任意数量 或任何字符中的任何一个 现在我有 le 0 m 你可以在以下位置看到它http regexr co
  • Django url 模式 - 带正斜杠的参数

    如何为两个参数创建 url 模式 其中第一个参数包含正斜杠作为其内容的一部分 da ta1 data2 最初我有以下模式 r view P
  • 独立于符号的字符串的模式匹配

    我需要一种算法 可以在数据中找到预定义的模式 以字符串的形式存在 独立于数据和模式的实际符号 字符 我只关心符号之间的关系 而不关心符号本身 数据中的同一符号具有不同的模式符号也是合法的 模式匹配算法必须强制执行的唯一一件事是保留模式中同一

随机推荐