`
luoshi0801
  • 浏览: 147688 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

hive中自定义RegexSerDe尝试

 
阅读更多

当原始数据中包好了诸如'\u0001'、'\u0002'、'\u0003'等hive默认的column分隔字符时,在select数据时就可能出现数据格式错乱的情况,为了避免这类现象,可以用自定义的RegexSerDe规避这类特殊字符。

 

例子:

ac18148213512592717614403|1351259272977|0.44|ulc|302|302^R670777442^RLBX001442114792309^R670777442^R2^R2??a±à??=KJ-0005,?ò?ònickangning^R^R^R^Rip^A^Rumid^A^RbuyerNick^Awnwangning^RStoreCode^AKJ-0005 

上面是一条原始数据,格式是traceId|time|rpcId|appName|queryKey|extendValue,extendValue是一个复合字段,可用字符'\u0018'(^R)劈成至少9列,前8列是意义固定,后面的每列是一个kv对,kv的分隔符是'\u0001'(^A)。

 

     对于这样的例子,如果尝试在创建hive表时存在如下指定:

     ROW FORMAT
     SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
     WITH SERDEPROPERTIES
    ( "input.regex" = "(.*)\\|(.*)\\|(.*)\\|(.*)\\|(.*)\\|(.*$)",
         "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s")

   然后在加载数据后做select时就会发现展现出来的最后一列在“ip”后面没有了。

   通过检验发现RegexSerDe按指定的正则切分完全正确,但hive在组装返回结果时会根据特殊字符(^A,^B,^C三种)做“二次切分”,因为例子中“ip”后面恰好有个^A所以被截断了,又因为"ip"所在的列是表的最后一列,所以"ip"后面的内容被直接丢掉了,否则会错位到表的下一列。

    解决的办法就是用自定义的MyRegexSerDe对特殊字符做简单替换,相比原RegexSerDe,只增加上一个简单逻辑:

for (int c = 0; c < numColumns; c++) {
      try {

        //对原数据的最后一列做特殊字符替换
        if (c == numColumns - 1) {
          row.set(c, m.group(c + 1).replace((char)1, ','));  
        } else {
          row.set(c, m.group(c + 1));
        }
      } catch (RuntimeException e) {
        partialMatchedRows++;
        if (partialMatchedRows >= nextPartialMatchedRows) {
          nextPartialMatchedRows = getNextNumberToDisplay(nextPartialMatchedRows);
          // Report the row
          LOG.warn("" + partialMatchedRows
              + " partially unmatched rows are found, " + " cannot find group "
              + c + ": " + rowText);
        }
        row.set(c, null);
      }
    }

   然后打包上传,执行hive sql时加载jar路径和指定自定义的RegexSerDe,问题得以解决。

分享到:
评论

相关推荐

    hive的自定义函数

    - **可重用性**:一旦编写并部署,可以在多个Hive查询中重复使用这些自定义函数,提高代码复用率。 ##### 2.2 UDF的编写步骤 1. **继承UDF类**:所有Hive UDF都必须继承自`org.apache.hadoop.hive.ql.exec.UDF`类。...

    Spark不能使用hive自定义函数.doc

    当开发者尝试在 Spark 应用程序中调用 Hive 的 UDF 时,可能会遇到如下错误或异常行为: - Spark 应用程序未能识别 Hive UDF。 - 执行包含 Hive UDF 的 Spark SQL 查询时出现运行时错误。 - Spark 的 DataFrame API ...

    hive数仓、hive SQL 、 hive自定义函数 、hive参数深入浅出

    Hive是大数据处理领域中的一个关键组件,它作为基于Hadoop的数据仓库工具,为企业提供了对大规模数据集的SQL-like查询和分析能力。本教程将深入探讨Hive数仓的架构与设计,Hive SQL的基本语法及高级特性,以及如何...

    hive 创建自定义函数 和 hive加载说明

    这篇博文主要探讨了如何在Hive中创建自定义函数以及如何加载它们,这对于深化Hive的使用和解决复杂的数据处理问题至关重要。 首先,我们来看一下创建自定义函数的过程。在Hive中,UDF分为三种类型:UDF(User ...

    hive自定义UDF编写函数.docx

    本文主要讲解了 Hive 中自定义 UDF 函数的编写方法,包括创建 UDF 类、实现自定义函数逻辑、编译和打包 UDF jar 包、上传至 Hive 服务器并注册自定义函数。 一、创建 UDF 类 为了实现自定义 UDF 函数,需要创建一...

    HIVE自定义UDF函数

    而自定义用户定义函数(UDF)是 Hive 中的一个重要功能,允许用户根据自己的需求编写自定义函数,以便在 Hive 查询中使用。 如何在 Hive 中创建自定义 UDF 函数: 步骤一:编写 Java 程序 首先,您需要编写一个 ...

    hive自定义函数demo

    本示例“hive自定义函数demo”将探讨如何在Hive中开发和使用自定义函数(UDF),这对于扩展Hive的功能和适应特定业务需求至关重要。下面,我们将深入学习与Hive自定义函数相关的知识。 1. **什么是Hive UDF?** ...

    hive-udf:hive自定义函数

    hive-udfhive自定义函数主要实现hive3种自定义函数1,udf函数,主要用于处理一对一数据处理2,udtf函数,主要用于处理一对多数据处理2,udaf函数,主要用与处理多对一数据聚合处理

    自定义hive函数

    开发和使用这些自定义函数时,需要理解Hive的生命周期、执行模型以及如何将Java代码集成到Hive环境中。同时,合理地设计和优化自定义函数,可以提高查询性能,降低数据处理的复杂性。在实际工作中,应结合具体业务...

    05.hive中如何自定义函数--json解析函数示例.mp4

    05.hive中如何自定义函数--json解析函数示例.mp4

    获取最大分区UDTF函数.doc

    ### 获取最大分区UDTF函数详解 #### 一、引言 在大数据处理场景下,特别是使用Hive进行数据仓库...通过以上的步骤,你可以轻松地在Hive环境中创建并使用自定义的UDTF来解决实际问题。希望这些内容能对你有所帮助。

    hive自定义udf函数实战

    udf函数,用户自定义函数,可以直接在sql语句中计算的函数 优点: 允许实现模块化的程序设计、方便修改代码、增加函数 UDF的执行速度很快,通过缓存计划在语句重复执行时降低代码的编译开销,比存储方法的执行效率...

    Hive的Udf函数进行数据脱敏

    总结来说,通过自定义UDF,我们可以方便地在Hive中实现数据脱敏功能,以保护敏感信息。这个过程涉及到Java编程、Hive API的使用以及SQL查询的编写。在实际应用中,可能需要根据业务需求调整UDF的行为,例如改变保留...

    Apache Hive 中文手册_hive_

    Apache Hive 是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供...

    部分普通sql查询在hive中的实现方式

    ### 部分普通SQL查询在Hive中的实现方式 Hive是一款基于Hadoop的数据仓库工具,能够对存储在Hadoop文件系统中的数据集进行数据提取、转换、加载(ETL),这是一种可以简化MapReduce编程的工具。由于Hive的设计初衷...

    hive UDF需要jar包

    在Hive中,UDF(User Defined Functions)是用户自定义函数,允许开发人员扩展Hive的内置功能,以满足特定的数据处理需求。Hive UDF的实现通常涉及到编写Java代码,并将其打包成JAR(Java Archive)文件,然后在Hive...

    大数据之Hive官方文档简要翻译(中文文档)

    Hive会首先尝试连接列表中的第一个URI,如果失败,则会尝试其他URI。 - `hive.metastore.local`:(从Hive 0.10版本开始废弃)用于指示是否使用本地或远程元存储。如果`hive.metastore.uris`为空,则假设为本地模式...

    Hive自定义函数

    【Hive自定义函数】是Hive为了满足用户在处理...这种自定义能力使得Hive能够适应各种业务场景,有效地处理大数据分析中的各种挑战。在实践中,正确理解和使用UDF与UDAF可以显著提升数据处理效率和解决方案的多样性。

    hive-udf(两地址间距离计算+省市区位置解析(Java代码))

    为了满足特定的业务需求,Hive提供了用户定义函数(UDF)的功能,允许用户自定义处理数据的逻辑。在这个“hive-udf”项目中,我们主要探讨的是如何利用Java编写UDF来实现两个地址间的距离计算以及省市区位置的解析。...

    Hive中SQL详解

    Hive中SQL详解 Hive是一个基于Hadoop构建的数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据。 Hive SQL支持绝大多数的语句,如DDL、DML、聚合函数、连接查询、条件查询等。 ...

Global site tag (gtag.js) - Google Analytics