使用 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 解压列数据的主要内容,如果未能解决你的问题,请参考以下文章