【问题标题】:Hive split on number of charactersHive 按字符数拆分
【发布时间】:2021-12-01 13:18:31
【问题描述】:

我有一个连续的随机字符数据文件,没有分隔符,也没有换行符。

例如。 "aaaaabbbbbcccccdddddeeeeefffff..."

我需要将其拆分为 Hive 中的 5 个字符列,例如:

aaaaa,bbbbb,ccccc ddddd,eeeee,fffff

我尝试了以下选项,但它们似乎都不起作用,因为没有分隔符。

  1. select substr(data,1,5)first_col, substr(data,6,5)second_col, substr(data,11,5)third_col from testdb1.example_table 这将正确地给我第一行,但无法弄清楚我该如何扩展它以用于下一行。

  2. 使用 regexp_extract 但再次因为没有分隔符来找出第二行,它似乎不起作用。

  3. 使用 split 或 RegexSerDe。

任何输入都会有所帮助。

【问题讨论】:

  • regex_serde 对此无济于事,因为它无法生成新行。对于未拆分的行 split/substr/regexp_extract 会将整个文件内容作为单行处理,即使它有效,它也是非常低效的并且会导致大数据上的 OOM 在加载数据之前应该拆分行。

标签: string split hive


【解决方案1】:

这是预处理数据的好时机。为什么不在它上面运行 sed 来添加分隔符? 这将每 30 个字符添加一个 '\n'

sed -e 's/.\{30\}/&\n/g' <file> > <new File>

将行分成 5 个字符组,以 ',' 分隔,行以 '\n' 终止

sed -E 's/(.\{5\})(.\{5\})(.\{5\})(.\{5\})(.\{5\})(.\{5\})/\1 , \2 , \3 , \4 , \5 , \6 \n/g' <file> > <new File>

这些 sed 对文件非常好,但不确定你的文件有多大。

如果你不使用 sed 或类似的东西,你可以纠正你自己的反序列化器。这里有一些链接可以帮助解决这个问题。

【讨论】:

  • 是的,如果可以使用 sed 就可以轻松完成。我一直在寻找一个答案,如果我们可以通过正则表达式方式在 Hive 中做到这一点,但我想这是不可能的,如果必须通过 Hive 做到这一点,那么自定义 SerDe 是唯一的选择。
  • 你有一个问题是你没有行来做本机。能够以特定方式操作文件和生成记录是一个很常见的要求。一旦您对这个答案感到满意,并且您认为这是正确的答案,我将不胜感激您将其标记为答案。
  • 如果你觉得这个答案有帮助并且你觉得很舒服,你能把它标记为正确吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
相关资源
最近更新 更多