使用 Hive UDF 解压列数据

Posted

技术标签:

【中文标题】使用 Hive UDF 解压列数据【英文标题】:Decompress column data using Hive UDF 【发布时间】:2017-05-19 04:37:36 【问题描述】:

背景: 使用 Hive UDF evaluate() 方法解压列数据

例外:

异常失败 java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException: 无法执行方法 public static org.apache.hadoop.io.Text Test.UDFDecompressor.evaluate(java.lang.String) 抛出 org.apache.hadoop.hive.ql.metadata.HiveException 对象 Test.UDFDecompressor@1008df1e 类 Test.UDFDecompressor 与 论据 x��kw⸲�_a�����֤�\��a-B�i�@`ï¿½ï¿½ï¿½ï¿½ï¿ ½"�nc3�I����$_�E�� 大小为 1

源代码:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.zip.DataFormatException;
import java.util.zip.InflaterInputStream;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.JavaStringObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

public class Decompress extends UDF
public static String evaluate(String data1) throws IOException, DataFormatException
ByteArrayInputStream bao=new ByteArrayInputStream(data1.getBytes());
InflaterInputStream iis= new InflaterInputStream(bao);
String out="";
byte[] bt=new byte[1024];
int len=-1;
while ((len =iis.read(bt))!=-1) 
out += new String(Arrays.copyOf(bt, len));

JavaStringObjectInspector stringInspector;
stringInspector = PrimitiveObjectInspectorFactory.javaStringObjectInspector;
String ip = stringInspector.getPrimitiveJavaObject(out);

//return new String(ip.getBytes(Charset.forName("UTF-8")));
//return new String(ip.getBytes(Charset.forName("UTF-8")));
return ip;


我尝试了多种使用 gZib、zLIb Java Api 解压缩的方法,但遇到了同样的错误。谁能帮我解决这个问题并建议正确的方法来使用 Hive UDF

解压缩列数据

提前致谢。

【问题讨论】:

【参考方案1】:
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.Text;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.InflaterInputStream;

public class Decompress extends UDF 

    private final Text r = new Text();

    public Text evaluate(BytesWritable bw) throws IOException 
        ByteArrayInputStream zipped = new ByteArrayInputStream(bw.getBytes());
        InflaterInputStream inflater = new InflaterInputStream(zipped);
        ByteArrayOutputStream unzipped = new ByteArrayOutputStream();
        byte[] bt = new byte[1024];
        int len;
        while ((len = inflater.read(bt)) != -1) 
            unzipped.write(bt, 0, len);
        

        r.clear();
        r.set(unzipped.toByteArray());
        return r;
    

【讨论】:

欢迎来到 Stack Overflow!这个答案可能是做原始海报试图做的更好的方法,但他们特别要求解释他们做错了什么。这不是那个。这不会帮助他们下次学习,这是 Stack Overflow 的重要组成部分。您能否就他们做错的地方添加一些评论,以及为什么您推荐这种方法?

以上是关于使用 Hive UDF 解压列数据的主要内容,如果未能解决你的问题,请参考以下文章

在 hive 中使用 python udf 时如何查询多个列?

我们可以从 Hive 中的自定义 UDF 运行查询吗?

UDF 在 Hive 中转换日期格式

带参数的 Hive Python UDF

需要从 HIVE UDF 中的 3 列构建 3 个列表

我的 Hive UDF 中的错误